4
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);
}

输出是 -

当前套接字缓冲区 len = 41600

setsock 选择成功

设置套接字 buff len = 41600 后。

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

提前致谢!

4

2 回答 2

3

如果内核是更新版本(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 的值

另请注意,“使用 setsockopt() 手动调整套接字缓冲区大小会禁用自动调整”。这是关于 linux 调优的好链接http://www.psc.edu/index.php/networking/641-tcp-tune

于 2015-11-18T18:18:41.193 回答
0

始终查看man页面上的内容:

SO_RCVBUF
设置或获取最大套接字接收缓冲区(以字节为单位)。当使用 设置它时,内核将这个值加倍(为簿记开销留出空间)setsockopt(2),并且这个加倍的值由getsockopt(2). 默认值由 /proc/sys/net/core/rmem_default文件设置,最大允许值由/proc/sys/net/core/rmem_max文件设置。此选项的最小(加倍)值为 256。

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

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

于 2019-01-30T09:29:16.937 回答