pythontcp服务器与c++客户端的对话

2024-10-01 17:32:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试在pythontcp服务器和c++TCP客户端之间进行通信时遇到了一个问题。 在第一次调用之后,后续调用会导致问题。在

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

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

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

当我运行一个c++客户机和一个c++服务器(python服务器的一个黑客复制品)时,客户机始终忠实地发送PSH、ACk和ACk包,即使是在第一次调用之后。在

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


Tags: 数据函数服务器send客户端客户机tcp意义
2条回答

你发送多大的包裹?在

如果它们很小-可能是你头痛吗?根据你所描述的,认为延迟确认与。。。在

client sends a PSH,ACK and then the server sends a PSH,ACK and a FIN,PSH,ACK

有一个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)

这是给客户的:

^{pr2}$

启动包嗅探器,然后运行服务器.py然后,客户端.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

相关问题 更多 >

    热门问题