当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-11 00:33:18 C#

C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值我们的高吞吐量应用(~1gbps)来自Benefit来自较大的ReceiveBufferSize和SendBufferSize。我注意到在我的机器上我可以有100MB的缓冲区大小没有问题,但在一些客户端和测试机器上,最大值略高于10MB并且似乎是可变的。有什么方法可以查询系统最大tx/rx缓冲区大小。事实上,对于高性能网络,SO_RCVBUF和SO_SNDBUF选项应设置为0以避免缓冲区复制,如KB181611中所述:如果使用SO_RCVBUF和SO_SNDBUF选项设置零TCP堆栈接收和发送缓冲区,基本上指示要使用的TCP堆栈I/O调用中提供的缓冲区直接执行I/O。所以,除了重叠套接字I/O的非阻塞优势之外,另一个优势是更好的性能,因为你为每个I/O调用创建一个缓冲区,在TCP堆栈缓冲区和用户缓冲区之间保存缓冲区副本。但是,您必须确保在提交重叠操作后以及重叠操作完成之前不会访问用户缓冲区。您可以设置这些选项的最大值(这是托管Socket.ReceiveBufferSize背后的实际设置)是“依赖于实现”的。其他TCP参数记录在TCP/IP注册表设置中。这两个属性在内部使用套接字选项(通过SetSocketOption,最终到本机setsockopt)。如果内存可用,它们将取决于可用的非页面缓冲池内存(它因机器而异)以及每台机器上可能的网络驱动程序。在任何情况下,您实际上都不能保证您请求的缓冲区大小将被使用,您必须事后检索当前缓冲区大小以确保它被使用。此外,在Windows7和2008机器上,我的理解是您的缓冲区可能会动态增长/减少。简而言之,您可能只能测试不断增加的缓冲区大小并采用不会导致错误的最大值。变量太多,无法确定最大尺寸。以上是C#学习教程:C#获取系统上Socket.ReceiveBufferSize和Socket.SendBufferSize的最大值共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: