如何设置UDP套接字的缓冲区大小?C#

如何设置UDP套接字的缓冲区大小?C#,c#,sockets,udp,buffer,C#,Sockets,Udp,Buffer,正如我们所知,对于UDP接收,我们使用Socket.ReceiveFrom或UdpClient.receive Socket.ReceiveFrom接受来自您的字节数组以将udp数据放入 接收直接返回数据所在的字节数组 我的问题是如何在套接字中设置缓冲区大小。我认为操作系统为接收UDP数据维护自己的缓冲区,对吗?例如,如果一个udp数据包被发送到我的机器,操作系统将把它放到一个缓冲区,然后等待我们Socket.ReceiveFrom或UdpClient.receive,对吗 如何更改内部缓冲区的

正如我们所知,对于UDP接收,我们使用Socket.ReceiveFrom或UdpClient.receive

Socket.ReceiveFrom接受来自您的字节数组以将udp数据放入

接收直接返回数据所在的字节数组

我的问题是如何在套接字中设置缓冲区大小。我认为操作系统为接收UDP数据维护自己的缓冲区,对吗?例如,如果一个udp数据包被发送到我的机器,操作系统将把它放到一个缓冲区,然后等待我们Socket.ReceiveFrom或UdpClient.receive,对吗

如何更改内部缓冲区的大小

我已经尝试过Socket.ReceiveBuffSize,它对UDP完全没有效果,并且它清楚地表明它是用于TCP窗口的。我还做了很多实验,证明Socket.ReceiveBufferSize不适用于UDP

任何人都可以分享一些关于UDP内部缓冲区的见解吗

谢谢

我在这里看到了一些帖子,例如

Dave说Socket.ReceiveBufferSize可以为UDP设置内部缓冲区。我不同意

我做的实验是这样的:

27台主机在局域网内同时向我发送10KB udp数据包(至少几乎是)。我有一个while循环来处理每个数据包。对于每个数据包,我创建一个线程来处理它。我使用UdpClient或Socket来接收数据包

我丢失了大约50%的数据包。我认为这是UDP发送的突发事件,我无法及时处理所有这些事件

这就是为什么我想增加UDP的缓冲区大小。比如说,如果我将缓冲区大小更改为1MB,那么在缓冲区中可以接受27*10KB=270KB的数据,对吗

我尝试将Socket.ReceiveBufferSize更改为许多值,但根本没有效果


任何人都可以提供帮助吗?

我经常使用.NET UDPClient,而且我一直使用,并取得了良好的效果。在内部,它使用参数进行调用。下面是一些快速、简单的代码,您可以使用这些代码进行测试:

public static void Main(string[] args)
{
  IPEndPoint remoteEp = null;
  UdpClient client = new UdpClient(4242);
  client.Client.ReceiveBufferSize = 4096;

  Console.Write("Start sending data...");
  client.Receive(ref remoteEp);
  Console.WriteLine("Good");

  Thread.Sleep(5000);
  Console.WriteLine("Stop sending data!");
  Thread.Sleep(1500);

  int count = 0;
  while (true)
  {
    client.Receive(ref remoteEp);
    Console.WriteLine(string.Format("Count: {0}", ++count));
  }
}
尝试调整传入ReceiveBufferSize的值。我测试了在5秒钟内发送一个恒定的数据流,得到了10个数据包。然后我增加了x4,下一次得到了38个数据包


我会在你的网络中寻找其他你可能丢弃数据包的地方。特别是因为您在邮件中提到您正在发送10KB的数据包。当10KB被发送到MTU大小的数据包时,它将被分段。如果该系列中的任何一个数据包被丢弃,整个数据包都将被丢弃。

设置ReceiveBufferSize的问题是,您需要在创建UdpClient对象后直接设置它。在获取ReceiveBufferSize的值时,我也遇到了同样的问题,即我的更改没有得到反映

UdpClient client = new UdpClient()
//no code inbetween these two lines accessing client.
client.Client.ReceiveBufferSize = somevalue

@谢谢你的回复。我的代码和你的非常相似。但是如果你感兴趣,你可以做一个简单的实验。我们有两个独立的类-服务器和客户端。在Client.cs中,只需使用UdpClient将200个数据包(每个10KB)发送到本地端口8888。(无论您想要什么端口)在您的Server.cs中,您都会不断收到代码中显示的内容。当然,请先运行Server.cs。我的结果是90%的数据包可以被接收。关键是UDP发送是一个突发,有太多的数据包到达,您的服务器无法处理。缓冲区溢出。是的,你是说将ReceiveBufferSize从一个值,比如说
4096
调整到一个更高的值,比如说
4*4096
没有任何作用吗?@heavyd,我能知道ReceiveBufferSize的上限是多少吗?@heavyd:在上面的本地实验中,如果不设置ReceiveBufferSize,90%的数据包被接收。如果我把它增加到16*4096,所有的都可以收到。但在我最初的实验中,它不起作用。@Jack,我不确定上限是多少。我最初的猜测是64K,但我找不到任何支持文档。在您的实验之后,您确定您的网络没有在数据包到达您的计算机之前丢弃它们吗。您可能正在使混音中的某个开关饱和,并在那里丢失数据包,而不是计算机上的堆栈。