【问题标题】:Python2 -> Python3 Socket is non-blocking in python2, but blocks longer in python3Python2 -> Python3 套接字在 python2 中是非阻塞的,但在 python3 中阻塞时间更长
【发布时间】:2021-01-08 21:40:27
【问题描述】:

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

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

Windows 10 专业版 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)

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


这里是发送数据的例子

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 代码感觉就像它挂在每个响应上一样。任何帮助表示赞赏!

【问题讨论】:

    标签: python python-3.x sockets


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-05
      • 2010-10-31
      • 2013-10-15
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多