python3/windows-10 UDP套接字错误?
我不确定这里有什么,但python UDP套接字的某些东西似乎奇怪地被破坏了。我已经将一个失败的单元测试隔离到它自己的简化代码中,并将其包含在下面。间歇性故障(大约10次运行中有1次)。我找不到失败的模式。有时第一次失败,第二次成功。另一次,它将通过前5次,失败一次,然后继续成功 测试机器是运行python 3.8.1的Windows 10 Pro 当它失败时,数据包永远不会被发送。我可以确认运行WireShark并在环回接口上跟踪UDP数据包。当它失败时,数据包不会被发送。我知道UDP是无保证的传输,但我从未考虑过这可以扩展到无保证传输。有没有可能我看到了某种Windows UDP数据包丢弃场景 注意:下面的代码是一个人为的测试来演示这个问题,但它是最小工作示例(MWE) 当它失败时,它会报告python3/windows-10 UDP套接字错误?,python,python-3.x,windows-10,udp,Python,Python 3.x,Windows 10,Udp,我不确定这里有什么,但python UDP套接字的某些东西似乎奇怪地被破坏了。我已经将一个失败的单元测试隔离到它自己的简化代码中,并将其包含在下面。间歇性故障(大约10次运行中有1次)。我找不到失败的模式。有时第一次失败,第二次成功。另一次,它将通过前5次,失败一次,然后继续成功 测试机器是运行python 3.8.1的Windows 10 Pro 当它失败时,数据包永远不会被发送。我可以确认运行WireShark并在环回接口上跟踪UDP数据包。当它失败时,数据包不会被发送。我知道UDP是无保证
socket.timeout
,这是由于调用settimeout
。我尝试将超时设置为30秒,但它不会改变故障,也不会改变故障频率
我已经确认UDP端口55000上没有绑定任何内容,并且测试机器上的所有防火墙都已禁用
任何想法或想法(无论多么疯狂)都将受到赞赏。UDP是一种不可靠的传输方式。你没有理由不看到失败。每1.5秒通过环回发送一个5字节的pkt,我们看到10%的下降率?派去?!这件事有些“感觉”不对。
import socket, threading, unittest
class Testmysock(unittest.TestCase):
r"""mysock unittest test case"""
def test_hello(self):
r"""test hello over udp"""
def hello():
r"""reply to server with hello"""
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.sendto(b'hello', ('127.0.0.1', 55000))
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.bind(('127.0.0.1', 55000))
thr = threading.Thread(target=hello)
thr.start()
sock.settimeout(2.0)
msg = sock.recv(128)
self.assertEqual(b'hello', msg)
thr.join(0.0)