【问题标题】:talking between python tcp server and a c++ clientpython tcp服务器和c++客户端之间的对话
【发布时间】:2010-11-28 05:43:08
【问题描述】:

我在尝试在 python TCP 服务器和 c++ TCP 客户端之间进行通信时遇到问题。 在第一次调用后,工作正常,随后的调用会导致问题。

就 WinSock 而言,send() 函数工作正常,它返回正确的长度,而 WSAGetLastError() 没有返回任何有意义的东西。

但是,当使用wireshark查看数据包时,我注意到第一个调用发送了两个数据包,一个PSH,ACK,其中包含所有数据,然后是一个ACK,但是随后的调用不起作用, 只发送 PSH,ACK 包,不发送后续的 ACK 包

接收计算机wireshark证实了这一点,python服务器什么也没做,它没有任何数据从套接字出来,我不能更深入地调试,因为套接字是一个本地类

当我运行一个 c++ 客户端和一个 c++ 服务器(python 会做的黑客复制品)时,客户端始终忠实地发送 PSH、Ak 和 ACK 数据包,即使在第一次调用之后也是如此。

winsock 发送函数是否应该总是发送一个 PSH、ACK 和一个 ACK​​? 如果是这样,为什么在连接到我的 C++ 服务器而不是 python 服务器时会这样做? 有没有人遇到过类似的问题?

【问题讨论】:

  • 在任一版本的服务器中,您是否看到从服务器发送的 ack?您提到客户端发送不应发生的确认,除非您从服务器获取某些内容。你确定 python 应用程序正在运行吗?

标签: c++ python networking sockets winsock


【解决方案1】:

您发送多大的数据包?

如果它们很小 - 可能是Nagle's Algorith & Delayed ACK Algorithm 是不是你很头疼?根据您的描述,认为涉及延迟 ACK...

【讨论】:

  • 我告诉wireshark查看服务器发回的所有内容,我发现对于第一次发送/接收,客户端发送一个PSH,ACK然后服务器发送一个PSH, ACK 和 FIN,PSH,ACK 返回,我的客户端用 PSH,ACK 响应,然后在第二次调用中,我发送我的第一个 PSH,ACK,服务器响应 RST 我得到一个连接重置请求,它当服务器没有收到 ACK 时发生?这可能是缺乏双缓冲的结果吗?
【解决方案2】:

客户端发送一个 PSH,ACK 然后 服务器发送一个 PSH、ACK 和一个 FIN,PSH,ACK

有一个 FIN,那么可能是您的服务器的 Python 版本在初始读取后立即关闭连接?

如果您没有显式关闭服务器的套接字,很可能是服务器的远程套接字变量超出范围,从而关闭了它(并且您的 C++ 版本中不存在此错误)?

假设是这种情况,我可以用这个代码为服务器产生一个非常相似的 TCP 序列:

# server.py
import socket
from time import sleep

def f(s):
        r,a = s.accept()
        print r.recv(100)

s = socket.socket()
s.bind(('localhost',1234))
s.listen(1)

f(s)
# wait around a bit for the client to send it's second packet
sleep(10)

这是给客户的:

# client.py
import socket
from time import sleep

s = socket.socket()
s.connect(('localhost',1234))

s.send('hello 1')
# wait around for a while so that the socket in server.py goes out of scope
sleep(5)
s.send('hello 2')

启动数据包嗅探器,然后运行 ​​server.py 和 client.py。这是tcpdump -A -i lo 的输出,与您的观察结果相符:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
12:42:37.683710 IP localhost:33491 > localhost.1234: S 1129726741:1129726741(0) win 32792 <mss 16396,sackOK,timestamp 640881101 0,nop,wscale 7>
E..<R.@.@...............CVC.........I|....@....
&3..........
12:42:37.684049 IP localhost.1234 > localhost:33491: S 1128039653:1128039653(0) ack 1129726742 win 32768 <mss 16396,sackOK,timestamp 640881101 640881101,nop,wscale 7>
E..<..@.@.<.............C<..CVC.....Ia....@....
&3..&3......
12:42:37.684087 IP localhost:33491 > localhost.1234: . ack 1 win 257 <nop,nop,timestamp 640881102 640881101>
E..4R.@.@...............CVC.C<......1......
&3..&3..
12:42:37.684220 IP localhost:33491 > localhost.1234: P 1:8(7) ack 1 win 257 <nop,nop,timestamp 640881102 640881101>
E..;R.@.@...............CVC.C<......./.....
&3..&3..hello 1
12:42:37.684271 IP localhost.1234 > localhost:33491: . ack 8 win 256 <nop,nop,timestamp 640881102 640881102>
E..4.(@.@...............C<..CVC.....1}.....
&3..&3..
12:42:37.684755 IP localhost.1234 > localhost:33491: F 1:1(0) ack 8 win 256 <nop,nop,timestamp 640881103 640881102>
E..4.)@.@...............C<..CVC.....1{.....
&3..&3..
12:42:37.685639 IP localhost:33491 > localhost.1234: . ack 2 win 257 <nop,nop,timestamp 640881104 640881103>
E..4R.@.@...............CVC.C<......1x.....
&3..&3..
12:42:42.683367 IP localhost:33491 > localhost.1234: P 8:15(7) ack 2 win 257 <nop,nop,timestamp 640886103 640881103>
E..;R.@.@...............CVC.C<......./.....
&3%W&3..hello 2
12:42:42.683401 IP localhost.1234 > localhost:33491: R 1128039655:1128039655(0) win 0
E..(..@.@.<.............C<......P...b...

9 packets captured
27 packets received by filter
0 packets dropped by kernel

【讨论】:

  • 这肯定是我使用 xmlrpc 服务器作为我的 python 服务器的问题,这显然是一个单一的服务实体?
猜你喜欢
  • 2011-11-05
  • 2020-11-28
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多