C# 动态更改套接字的接收缓冲区大小

C# 动态更改套接字的接收缓冲区大小,c#,sockets,buffer,C#,Sockets,Buffer,我有不同长度的字节数组,可以从windows桌面应用程序发送到另一台PC服务器上的windows服务。我使用的是C#中的套接字。我想做的是计算出要发送的字节数,然后将信息发送到服务器。服务器应用程序将调整接收缓冲区大小,以适应从客户端发送到该服务器的字节数组。这是一个糟糕的主意还是一个好主意?随着应用程序的进展,动态更改接收缓冲区 感谢如果应用程序读取数据的速度低于网络可以发送的速度,则接收端缓冲区大小的作用是缓冲数据包。如果发送方以突发方式发送数据,它也会有所帮助。因此,将其保持为多个MTU(

我有不同长度的字节数组,可以从windows桌面应用程序发送到另一台PC服务器上的windows服务。我使用的是C#中的套接字。我想做的是计算出要发送的字节数,然后将信息发送到服务器。服务器应用程序将调整接收缓冲区大小,以适应从客户端发送到该服务器的字节数组。这是一个糟糕的主意还是一个好主意?随着应用程序的进展,动态更改接收缓冲区


感谢

如果应用程序读取数据的速度低于网络可以发送的速度,则接收端缓冲区大小的作用是缓冲数据包。如果发送方以突发方式发送数据,它也会有所帮助。因此,将其保持为多个MTU(10/20)的倍数就足够了。如果我理解正确的话,那么您正在尝试通信您想要发送的整个数据集(字节数组的长度),并使接收端缓冲区具有相同的大小——如果您想要发送的数据太大,这肯定是不必要的,而且效率会很低!它效率低下的原因是操作系统必须为接收缓冲区分配那么多内存。

您好,感谢您如此简洁的回答。这是有道理的。但有一个问题。。。你说‘将其保持为几个MTU的倍数(10/20)’。。。顺便说一句,你说我意识到我应该知道这意味着什么。(我甚至用谷歌搜索过)。但我不知道:)这是与网络适配器有关还是..?嗯,MTU指的是MAC层可以传输的帧中的最大数据量。对于以太网,它通常是1500。当然,以太网也在其上添加了自己的18个字节。发送小于或等于MTU的数据意味着以太网可以在不将其拆分为多个帧的情况下发送数据;实际上,IP层就是这样做的,称为碎片。碎片是不好的,因为即使删除了一个碎片,也需要重新传输整个碎片集。因此,在发送数据包时,MTU有一个隐含但重要的考虑因素。看起来,networks adapter确实允许您选择MTU大小:好的,那么获取我用于接收的适配器MTU属性并将缓冲区大小设置为该值?通常,您不必修改适配器的MTU设置。。看看MTU是什么。事实上,您应该能够使用socket get option API获取SO_RCVBUF。若您希望能够缓冲更多的数据(可能是由于应用程序速度较慢),那个么只需使用套接字集选项API将其增加一倍即可。