套接字缓冲区大小不增加

Socket buffer size not increasing

int n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
    printf("Get socket option failed, errno: %d\n",errno);
}
else
{
    printf("Current socket buff len = %d\n", n);
}
n = 225280;
if(0 != setsockopt(iSockFd, SOL_SOCKET, SO_RCVBUF, (const void *)&n, sizeof(n)))
{
    printf("setsock err errno %d\n", errno);
}
else
{
    printf("setsock opt success\n");
}
n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
    printf("Get socket option failed, errno: %d\n",errno);
}
else
{
    printf("After setting socket buff len = %d\n", n);
}

输出为-

当前套接字buff len = 41600

setsock opt 成功

设置socket buff len = 41600后。

看起来接收缓冲区大小没有增加,知道为什么会这样吗?

提前致谢!

如果内核是较新版本(2.6.17或更高),请通过验证文件/proc/sys/net/ipv4/tcp_moderate_rcvbuf检查是否启用了自动调整。如果 tcp_moderate_rcvbuf 的值为 1,则启用自动调整。在这种情况下,接收缓冲区将由内核动态更新并绑定到 /proc/sys/net/ipv4/tcp_rmem 中的值。检查是否达到此限制。

如果内核是旧版本,请检查SO_RCVBUF是否受限于/proc/sys/net/core/rmem_default和/proc/sys/net/core/rmem_max中的值。 如果是 TCP,还要检查 /proc/sys/net/ipv4/tcp_rmem

的值

还要注意 'Manually adjusting socket buffer sizes with setsockopt() disables autotuning' 。 link 关于 linux http://www.psc.edu/index.php/networking/641-tcp-tune

的调整很好

经常看看 man 页面上写的是什么:

SO_RCVBUF
Sets or gets the maximum socket receive buffer in bytes. The kernel doubles this value (to allow space for bookkeeping overhead) when it is set using setsockopt(2), and this doubled value is returned by getsockopt(2). The default value is set by the /proc/sys/net/core/rmem_default file, and the maximum allowed value is set by the /proc/sys/net/core/rmem_max file. The minimum (doubled) value for this option is 256.

http://man7.org/linux/man-pages/man7/socket.7.html

所以有一个上限,任何设置更大值的尝试都会默默地失败,这意味着不会有错误,只是不会增加大小。几乎所有现有系统都存在这样的限制,而不仅仅是 Linux。另请注意,即使您的 setsockopt() 成功,getsockopt() 也会 return 更大的值,因为该值在内部加倍(这是 Linux 独有的,其他系统不这样做那个)。