套接字缓冲区大小不增加

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

输出是 –

当前socket buff = 41600

setsockselect成功

设置套接字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的值

还要注意'用setsockopt()手动调整套接字缓冲区大小会禁用自动调整“。 这里有很好的链接调整为Linux http://www.psc.edu/index.php/networking/641-tcp-tune