我正在尝试找出可能导致我在测试系统时观察到的奇怪问题的原因。
被测系统通过 UDP 从外部源接收 HTTP 请求。为了进行测试,我使用 Python 通过本地网络发送 UDP 数据包来模拟此源以进行测试,我发送了 1、20、133 和 1000 条消息。
当我在本地 Windows 机器上运行测试时,我经常会丢失 UDP 数据包,有时甚至无法接收到单个消息。然而,当我使用 Virtual Box 创建一个虚拟 Linux Box (Centos) 并从那里运行相同的测试时,我在 100% 的时间内获得了 100% 的成功率。
从 Windows 发送 UDP 消息是否存在任何已知问题,我可以在我的机器上调整 Windows 和 Linux 之间任何奇怪的缓冲差异?
最佳答案
如果传入的数据包不适合接收缓冲区,操作系统的 UDP 堆栈通常会丢弃接收到的 UDP 数据包。如果接收应用程序读取缓冲区(=套接字)的速度不够快,则接收缓冲区可能已“满”。
Windows 的默认接收缓冲区大小可能比 Linux 小。
为了更好地处理传入的 UDP 数据包的突发,您可以增加接收缓冲区的大小:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)
您还可以使用 getsockopt
来检查大小。
关于linux - 使用 Windows 而不是 Linux 时 UDP 数据包丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51515780/