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。
看起来接收缓冲区大小没有增加,任何想法为什么会发生这种情况?
提前致谢!
答案 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专有的,其他系统则不行)。