我的程序使用UdpClient尝试接收来自27台主机的27个响应。响应的大小为10KB。我的宽带传入带宽是150KB/s。
这27个响应几乎同时且每10秒从主机发送一次。
但是,我每次只能收到8- 17个回复。我可以接收的响应数量是非常动态的,但在范围内。
有人能告诉我为什么吗?为什么我不能全部收到?
我知道UDP是不可靠的。但是我试着同时收到5- 10个回复,它起作用了。我猜网络连接不是那么糟糕。
代码非常简单。在27台主机上,我只使用UdpClient将10KB发送到我的机器。
在我的机器上,我有一个UdpClient接收数据报。每次我得到一个数据,我都会创建一个线程来处理它(基本上处理它意味着只打印出“我收到了10KB",但它是在一个线程中运行的)。
listener = new UDPListener(Port);
listener.Start();
while (true) {
try {
UDPContext context = listener.Accept();
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleMessage), context);
} catch (Exception) { }
}如果我将响应的大小减少到3KB,情况会变得更好,可以收到大约25个响应。
还有更多的想法吗?UDP缓冲区问题?
发布于 2010-03-09 00:50:10
正如您自己所说,UDP是不可靠的。因此,数据包很可能会在某处被丢弃。
请注意,由于交换机/路由器/网卡过载而导致数据包丢失的原因与链路损坏的原因一样多。如果有人“同时”给你发送了27个10Kb的回复。很可能是您的网卡或附近交换机的缓冲区已满,数据包被丢弃。
在您有一些代码可供展示之前,可能没有什么可说的了。
发布于 2010-03-09 03:24:40
10kb的数据包可能正在被分段。如果其中一个片段被丢弃,数据包就不能重新组装。根据您的网络,3kb的数据包可能不会被分割,但在任何情况下,它们都会被分割得更少,从而增加它们通过的机会。您可以运行PMTU发现工具来找出链路支持的最大数据包大小。
发布于 2010-03-17 06:33:39
我认为UDP是根本不可靠的,所以我认为这个问题是因为你遇到了一个瓶颈(它是如何被调用的) UDP发送所有的东西,但是无序和没有检查,所以我认为你必须使用UDP创建这种协议,我告诉这个原因我已经使它的关键是尝试发送所有的包与ID. .这样接收器知道哪些包丢失并且可以请求它们到发送器,就像TCP通常做的那样。
https://stackoverflow.com/questions/2402944
复制相似问题