【发布时间】:2012-03-13 16:39:55
【问题描述】:
众所周知,对于 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 台主机同时(至少几乎)在一个 LAN 内向我发送一个 10KB 的 udp 数据包。我有一个while循环来处理每个数据包。对于每个数据包,我创建一个线程来处理它。我使用 UdpClient 或 Socket 接收数据包。
我丢失了大约 50% 的数据包。我认为这是UDP发送的爆发,我无法及时处理所有这些。
这就是我想增加 UDP 缓冲区大小的原因。比如说,如果我把缓冲区大小改成 1MB,那么缓冲区可以接受 27 * 10KB = 270KB 的数据,对吧?
我尝试将 Socket.ReceiveBufferSize 更改为许多值,但它根本没有效果。
有人可以帮忙吗?
【问题讨论】: