c# - C# UDP 套接字的 ReceiveBufferSize 是否适用于数据报的大小或消息队列的大小?
问题描述
我有一个托管在天蓝色云上的 C# UDP 套接字,它使用UdpClient.receive
. 可能有数千个客户端同时向套接字发送消息,每个客户端发送大小约为 1Kb 的数据报。
我很困惑是否ReceiveBufferSize
适用于每个数据报的大小,或者它是否设置了下面的接收队列的大小?接收队列是指.NET 运行时用来将来自不同客户端的UdpClient.receive
尚未读取的数据报排入队列的队列。
我在一些帖子中读到ReceiveBufferSize
仅适用于单个数据报的大小,如果是这种情况,我们将如何设置下面的接收队列的大小?
我已将其设置ReceiveBufferSize
为 65Kb。如果这ReceiveBufferSize
适用于后台队列大小,并且每个客户端同时发送一个 1Kb 数据报,这是否意味着套接字只能处理来自 65 个客户端的数据?如果有更多的客户端同时发送缓冲区溢出和数据报丢失?
解决方案
大概你的意思是UdpClient.Client.ReceiveBufferSize
,即Socket.ReceiveBufferSize
?
如果你追赶那个电话,你最终会接到一个电话到setsockopt
这里,有SO_RCVBUF
选择权。
研究该选项,您最终会从@DS得到这个答案:
SO_RCVBUF
更容易理解:它是内核分配的缓冲区大小,用于保存到达给定套接字的数据,在数据通过网络到达与拥有此套接字的程序读取之间的时间。使用 TCP,如果数据到达而您没有读取它,缓冲区将填满,发送方将被告知放慢速度(使用 TCP 窗口调整机制)。对于 UDP,一旦缓冲区已满,新的数据包将被丢弃。
这表明它是与套接字关联的整个队列的大小,即操作系统会将接收到的 UDP 数据报放入供您读取的缓冲区有多大。一旦这已满,额外的数据报将被丢弃。