我每秒接收约3000个UDP数据包,每个数据包的大小约为200字节。我编写了一个Java应用程序,它监听那些UDP数据包,然后将数据写入文件中。然后,服务器以先前指定的速率发送15000条消息。写入文件后,它仅包含约3500条消息。使用wireshark,我确认我的网络接口(interface)已收到所有15000条消息。之后,我尝试更改套接字的缓冲区大小(最初为8496bytes):
(java.net.MulticastSocket)socket.setReceiveBufferSize(32*1024);
该更改将保存的邮件数量增加到约8000条。我一直将缓冲区大小增加到1MB。此后,保存的邮件数量达到〜14400。将缓冲区大小增加到更大的值不会增加保存的消息数。我想我已经达到了允许的最大缓冲区大小。尽管如此,我仍需要捕获网络接口(interface)收到的所有15000条消息。
任何帮助,将不胜感激。提前致谢。
最佳答案
像 bug 一样闻起来,很可能在您的代码中。如果UDP数据包是通过网络传递的,则将它们排队等待本地传递,就像您在Wireshark中看到的那样。也许您的程序在从套接字中读取时并没有取得及时的进展-是否有专门的线程来执行此任务?
通过检测程序丢失了哪些数据包,您也许可以取得一些进展。如果所有丢失的数据包都是早期数据包,则可能是在程序等待接收它们之前发送数据。如果他们都晚了,也许退出太早了。如果它们间隔固定,则您的代码中可能会出现一些问题,从而导致循环接收数据包。等等。
无论如何,您似乎都非常担心丢失数据包。通过设计UDP不是可靠的传输。如果丢失这些多播数据包对您的系统来说是一个问题(而不仅仅是性能方面的原因,您想解决的一个谜),那么系统设计是错误的。