linux - 使用 windows 而不是 Linux 时 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
用于检查大小。
推荐阅读
- docker - 是否可以从已使用的 Docker 容器创建新的 Docker 映像?
- java - 带有图像的请求中的管道损坏(写入失败)网关 x 服务
- c# - 在 Unity 中存储只读数据的良好做法
- mysql - MySQL DATE_ADD 语句根据书但不会返回结果
- excel - 从 Windows 文件夹读取的 Outlook 消息对于某些值是空白的
- sql-server - 如何在未透视表中创建计算行?
- mongodb - Mongodb:按id过滤父级时增加嵌套数组中的值
- algorithm - RSA加密后用户如何访问他的任何消息?
- ms-access - 仅在列表表单中显示每个员工的最新条目
- html - Django:引导类加载但不是我的 style.css