python-tcp服务器与c++;客户 我有一个问题,试图在Python TCP服务器和C++ TCP客户端之间进行通信。 在第一次调用后(该调用工作正常),后续调用会导致问题

python-tcp服务器与c++;客户 我有一个问题,试图在Python TCP服务器和C++ TCP客户端之间进行通信。 在第一次调用后(该调用工作正常),后续调用会导致问题,c++,python,networking,sockets,winsock,C++,Python,Networking,Sockets,Winsock,就WinSock而言,send()函数工作正常,它返回正确的长度,而WSAGetLastError()不返回任何有意义的内容 但是,当使用wireshark查看数据包时,我注意到第一次呼叫发送两个数据包,一个包含所有数据的PSH,ACK,以及一个紧接着的ACK,但是后续呼叫不起作用,只发送PSH,ACK数据包,而不发送后续ACK数据包 接收计算机wireshark证实了这一点,python服务器什么也不做,它没有任何数据从套接字中出来,我无法进行更深入的调试,因为套接字是本机类 当我运行C++客

就WinSock而言,send()函数工作正常,它返回正确的长度,而WSAGetLastError()不返回任何有意义的内容

但是,当使用wireshark查看数据包时,我注意到第一次呼叫发送两个数据包,一个包含所有数据的PSH,ACK,以及一个紧接着的ACK,但是后续呼叫不起作用,只发送PSH,ACK数据包,而不发送后续ACK数据包

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

<>当我运行C++客户端和C++服务器(一个被破解的Python一个复制品)时,客户端即使在第一次调用之后,也会忠实地发送PSH、ACK和ACK包。 winsock发送函数是否应始终发送PSH、ACK和ACK? 如果是这样,为什么当连接到我的C++服务器而不是Python服务器时会这样做?
有人遇到过类似的问题吗?

您发送的数据包大小是多少

如果它们很小-可能是你的头痛?从你描述的情况来看,我认为延迟确认涉及到

客户端发送PSH、ACK,然后 服务器发送PSH、ACK和 芬恩,PSH,阿克

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

如果您没有明确关闭服务器的套接字,那么服务器的远程套接字变量可能超出范围,从而关闭它(并且这个bug不存在于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
tcpdump:抑制详细输出,使用-v或-vv进行完整协议解码
监听lo,链路类型EN10MB(以太网),捕获大小96字节
12:42:37.683710 IP localhost:33491>localhost.1234:S 1129726741:1129726741(0)赢32792
E本地主机:33491:S 1128039653:1128039653(0)确认1129726742赢32768

E..在任一版本的服务器中,您是否看到服务器发送的ack?您提到了客户端发送的ack,除非您从服务器获取了一些信息,否则不会发生这种情况。你确定python应用程序运行正常吗?我告诉wireshark也查看服务器发送回的所有内容,我发现对于第一次发送/接收,客户端发送一个PSH,ACK,然后服务器发送一个PSH,ACK和一个FIN,PSH,ACK,我的客户端用PSH,ACK响应,然后对于第二次呼叫,我发送我的第一个PSH,ACK,服务器响应RST im,收到连接重置请求,这在服务器未收到ACK时发生?这可能是缺少双缓冲的结果吗?这无疑是我使用xmlrpc服务器作为python服务器的问题所在,它显然是一个单一的服务实体?