linux - 使用 Windows 而不是 Linux 时 UDP 数据包丢失

标签 linux windows udp

我正在尝试找出可能导致我在测试系统时观察到的奇怪问题的原因。

被测系统通过 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/

相关文章:

c - 用于从现有文件创建 (.so) 文件的 makefile

windows - 使用批处理启动服务器后关闭 cmd

java - 服务器未收到 UDP 广播数据包

c++ - 什么是 SetupAPI、SetupAPI1 和 SetupAPI2?它们之间有什么区别?

sockets - iperf3:无法创建新流

c# - 等待网络 C# 控制台应用程序完全启动

linux - Maui 集群调度程序 : reporting

c# - 为什么RabbitMQ在Linux上连接失败,但在Windows上可以连接?

c - 为什么我的 Linux 信号处理程序对信号没有反应?

windows - 目标文件夹访问被拒绝 - 您需要权限才能执行此操作