gpt4 book ai didi

c# - 如何设置底层 Socket UDP 的缓冲区大小?

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:49 28 4
gpt4 key购买 nike

我们知道对于 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 更改为许多值,但它根本没有效果。

有人可以帮忙吗?

最佳答案

我偶尔会丢包,但我通过增加缓冲区成功了。

我使用了 UdpClient,在它的套接字上,我设置了一个比默认值(8192 字节)更大的值。这为我解决了问题。

在我的场景中可以清楚地跟踪到尺寸越小,滴落的频率越高,越大,滴落的次数越少。我最终为我的应用程序选择了 2^18 的值。

关于c# - 如何设置底层 Socket UDP 的缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410795/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com