Csharp/C#教程:C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值分享


C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值

我们的高吞吐量应用程序(~1gbps)从大型ReceiveBufferSize和SendBufferSize中获益匪浅。

我注意到在我的机器上我可以有100 MB的缓冲区大小没有问题,但在某些客户端和测试机器上,最大值略大于10 MB并且似乎是可变的。

是否有任何方法可以查询系统max tx / rx缓冲区大小。

实际上,对于高性能网络, SO_RCVBUFSO_SNDBUF选项应设置为0以避免缓冲区副本,如KB181611所示 :

如果使用SO_RCVBUF和SO_SNDBUF选项设置零TCP堆栈接收和发送缓冲区,则基本上指示TCP堆栈使用I / O调用中提供的缓冲区直接执行I / O. 因此,除了重叠套接字I / O的非阻塞优势之外,另一个优点是更好的性能,因为您为每个I / O调用在TCP堆栈缓冲区和用户缓冲区之间保存缓冲区副本 。 但是,一旦提交重叠操作并且在重叠操作完成之前,您必须确保不访问用户缓冲区。

您可以设置这些选项的最大值(这是托管Socket.ReceiveBufferSize背后的真实设置)是“依赖于实现”。 TCP / IP注册表设置中记录了其他TCP参数。

这两个属性在内部使用套接字选项(通过SetSocketOption ,最终到本机setsockopt )。 如果内存服务,它们将取决于可用的非分页池内存(这会将机器更改为机器)以及每台机器上可能的网络驱动程序。

无论如何,实际上您无法保证使用您请求的缓冲区大小,您必须在事后检索当前缓冲区大小以确保使用它。 此外,在Windows 7和2008机器上,我的理解是您的缓冲区可能会动态增加/减少 。

简而言之,您可能只能测试增加的缓冲区大小并采用不会导致错误的最大值。 有太多的变量可以确定最大尺寸。

上述就是C#学习教程:C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1026596.html

(0)
上一篇 2022年1月9日
下一篇 2022年1月9日

精彩推荐