为什么我无法获取所有UDP数据包?

时间:2010-03-08 16:45:34

标签: c# sockets udp

我的程序使用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缓冲问题???

3 个答案:

答案 0 :(得分:5)

正如你自己所说,UDP并不可靠。因此,数据包丢失的可能性很大。

请注意,丢失的交换机/路由器/网卡和坏链路一样会导致数据包丢失。如果有人“同时”向你发送了27个10Kb的回复。很可能是你的网卡或附近的交换机的缓冲区已满,而且数据包被丢弃了。

在你要显示一些代码之前,可能没什么可说的了。

答案 1 :(得分:1)

10kb数据包可能正在碎片化。如果甚至丢弃其中一个片段,则无法重新组装数据包。根据您的网络,3kb数据包可能不会被分段,但无论如何它们将被分散得更少,增加了它们通过的机会。您可以运行PMTU发现工具来查找链接支持的最大数据包大小。

答案 2 :(得分:0)

我认为UDP根本不可靠,所以我认为这个问题是因为你遇到了瓶颈(它是多么尖锐的调用)UDP发送的所有内容都是无序的,没有检查 所以我认为你必须使用UDP创建这种协议,我告诉这个原因我已经做到了 关键是尝试发送带有ID的所有包。通过这种方式,接收器知道丢失了哪些包,并且可以向发送器请求它们,就像TCP通常那样