我每秒接收约 3000 个 UDP 数据包,每个数据包的大小约为 200 字节。我编写了一个 java 应用程序,它侦听这些 UDP 数据包并将数据写入文件。然后服务器以先前指定的速率发送 15000 条消息。写入文件后,它仅包含约 3500 条消息。使用wireshark,我确认我的网络接口收到了所有15000 条消息。之后我尝试更改套接字的缓冲区大小(最初为 8496 字节):
(java.net.MulticastSocket)socket.setReceiveBufferSize(32*1024);
这一更改将保存的消息数量增加到约 8000 条。我不断地将缓冲区大小增加到 1MB。此后,保存的消息数量达到~14400条。将缓冲区大小增加到更大的值不会增加保存的消息数量。我认为我已经达到了允许的最大缓冲区大小。尽管如此,我仍然需要捕获我的网络接口收到的所有 15000 条消息。
任何帮助,将不胜感激。提前致谢。
闻起来像一个错误,很可能在您的代码中。如果 UDP 数据包通过网络传送,它们将在本地排队等待传送,正如您在 Wireshark 中看到的那样。也许您的程序在从套接字读取数据时没有及时取得进展 - 是否有专门的线程来执行此任务?
您也许可以通过检测来取得一些进展which您的程序丢失了数据包。如果所有丢失的数据包都是较早的数据包,则可能在程序等待接收数据之前就已经发送了数据。如果他们都晚了,也许退出得太早了。如果它们是定期的,那么您的代码可能会出现一些问题,导致循环接收数据包。 ETC。
无论如何,您似乎对丢失的数据包异常焦虑。从设计上来说,UDP 并不是一种可靠的传输方式。如果这些多播数据包的丢失是您的系统的一个问题(而不仅仅是您出于性能原因想要解决的一个谜),那么系统设计就是错误的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)