套接字缓冲区大小不增加

时间:2015-11-18 09:07:36

标签: c linux sockets setsockopt

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 = 41600

setsock opt success

设置套接字缓冲区len = 41600。

看起来接收缓冲区大小没有增加,任何想法为什么会发生这种情况?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果内核版本较新(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

的良好链接

答案 1 :(得分: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专有的,其他系统则不行)。