正如我们所知道的UDP接收,我们使用Socket.ReceiveFrom或UdpClient.receive
Socket.ReceiveFrom接受你的一个字节数组,将udp数据放入。
UdpClient.receive直接返回数据为
的字节数组我的问题是如何在Socket中设置缓冲区大小。我认为操作系统维护自己的缓冲区来接收UDP数据,对吧?例如,如果将udp数据包发送到我的机器,操作系统会将它放到缓冲区并等待我们进入Socket.ReceiveFrom或UdpClient.receive,对吗?
如何更改内部缓冲区的大小?
我尝试过Socket.ReceiveBuffSize,它对UDP没有任何影响,它清楚地说它是用于TCP窗口的。此外,我做了很多实验,证明Socket.ReceiveBufferSize不适用于UDP。
任何人都可以分享UDP内部缓冲区的一些见解吗???
我在这里看过一些帖子,例如,
http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c80ad765-b10f-4bca-917e-2959c9eb102a
Dave说Socket.ReceiveBufferSize可以为UDP设置内部缓冲区。我不同意。
我做的实验是这样的:
27个主机同时在局域网内(至少差不多)向我发送一个10KB的udp数据包。我有一个while循环来处理每个数据包。对于每个数据包,我创建一个处理它的线程。我使用UdpClient或Socket接收数据包。
我丢失了大约50%的数据包。我认为这是UDP发送的爆发,我无法及时处理所有这些。
这就是为什么我想增加UDP的缓冲区大小。比方说,如果我将缓冲区大小更改为1MB,那么缓冲区中可以接受27 * 10KB = 270KB的数据,对吗?
我尝试将Socket.ReceiveBufferSize更改为许多值,它根本没有效果。
任何人都可以提供帮助吗?
答案 0 :(得分:1)
我偶尔会丢弃数据包,并且通过增加缓冲区获得了成功。
我使用了UdpClient,在它的套接字上,我设置了一个比默认值更大的值(即8192字节)。这解决了我的问题。
在我的场景中可以清楚地跟踪尺寸越小,下降越多,越大,越少。我最终为我的应用选择了2 ^ 18的值。