繁体   English   中英

Python2 -> Python3 套接字在 python2 中是非阻塞的,但在 python3 中阻塞时间更长

[英]Python2 -> Python3 Socket is non-blocking in python2, but blocks longer in python3

尝试使用 socket.recv 和 socket.sendto() 连接到具有 UDP 套接字的局域网上不可用的主机。

两个 python 版本的系统架构相同,只是 python 不同。

Windows 10 Pro x64 Python 2.7 至 Python 3.8

在 python2 和 python3 版本中,正在接收的套接字是使用 socket.setblocking(0) 设置的,但由于某种原因,python3 等效项显然需要更长的时间来接收数据。 就好像它仍然设置为阻塞,或者在超时之前等待响应。

发送和接收的数据以每秒 100 赫兹的速度流动,如果有帮助的话。

s_from_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # UDP
s_from_server.setblocking(0)

设置,然后

 s_from_dspace.bind((ANY_IP, RX_SERVER_PORT))

套接字已绑定。

data_server = s_from_server.recv(364)

然后通过接收到的数据完成代码的 Rest。


这是发送数据的示例

s_to_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # UDP
bytes_to_server = struct.pack('H', gpsWeek)
bytes_to_server += struct.pack('dd', gpsSOW, utcTime)
s_to_server.sendto(bytes_to_server, (SERVER_UDP_IP, TX_SERVER_PORT))

我只是不确定 Python 2 和 Python 3 之间发生了什么变化导致这种滞后。 Python2 在所有方面都感觉几乎是瞬间完成的,但 python3 代码感觉就像它挂在每个响应上一样。 任何帮助表示赞赏! <3

使用 UDP 我认为您应该使用socket.recvfrom并指定您希望接收的字节数,例如socket.recvfrom(4096) 4096这里是一个任意的数字,你应该根据服务器协议添加你自己的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM