我正在尝试在使用python中使用udp。
代码很简单
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(data_to_send, (host, port))
received_data = s.recvfrom(1024)
我的问题是,sendto
和recvfrom
阻止方法吗?也就是说,当我调用sentdo
时,我的代码会停止并等待recvfrom
,因为,我在Localhost上闲逛并测试客户端和服务器模型,并手动注入3和4秒的随机睡眠时间以模拟现实生活延迟,以及如果延迟有点高,我会得到ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
。
这些调用 may 阻止它们被执行的线程。
sendto
如果您的OS内核的出站缓冲区已满,并且需要时间才能容纳您愿意发送的消息。sendto
不会阻止,因为远程应用程序尚未调用recvfrom
。
recvfrom
将阻止,直到您的操作系统内核的入站缓冲区有东西要读取。如果远程对等式尚未发送任何内容或尚未到达消息,recvfrom
将阻止。
另外,您身边可能发生一些错误的配置。ConnectionResetError
可能会发生,因为某处有防火墙。由于UDP没有连接和超时,延迟与问题无关。