我们知道,在接收UDP数据时,可以使用Socket.ReceiveFrom或UdpClient.receive函数。
Socket.ReceiveFrom函数需要你提供一个字节数组,用于存放UDP数据。
UdpClient.receive函数直接返回包含数据的字节数组。
我的问题是如何在Socket内部设置缓冲区大小。我认为操作系统维护了自己的缓冲区来接收UDP数据,对吗?例如,如果有一个UDP数据包发送到我的计算机,操作系统会将其放入缓冲区,并等待我们执行Socket.ReceiveFrom或UdpClient.receive函数,对吗?
我该如何更改该内部缓冲区的大小呢?
我尝试过使用Socket.ReceiveBufferSize,但它对UDP没有任何影响,并且它明确说明它是针对TCP窗口的。此外,我已经进行了许多实验,证明Socket.ReceiveBufferSize不适用于UDP。
有人能分享一些关于UDP内部缓冲区的见解吗?
谢谢。
我在这里看到了一些帖子,例如:
http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c80ad765-b10f-4bca-917e-2959c9eb102a
戴夫说Socket.ReceiveBufferSize可以设置UDP的内部缓冲区。我不同意。我的实验是这样的:
27个主机在同一时间(至少几乎)在局域网内向我发送一个10KB的udp数据包。我有一个while循环来处理每个数据包。对于每个数据包,我创建一个线程来处理它。我使用UdpClient或Socket接收数据包。
我丢失了大约50%的数据包。我认为这是UDP发送的爆发,我无法及时处理所有数据包。
这就是为什么我想增加UDP的缓冲区大小。比如说,如果我将缓冲区大小改为1MB,那么可以在缓冲区中接受27 * 10KB = 270KB的数据,对吧?
我尝试将Socket.ReceiveBufferSize更改为许多值,但根本没有任何效果。
有人能帮忙吗?