c - 套接字缓冲区大小不增加

标签 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 len = 41600

设置套接字成功

设置socket buff len = 41600后。

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

提前致谢!

最佳答案

如果内核是较新版本(2.6.17 或更高版本),请通过验证文件/proc/sys/net/ipv4/tcp_moderate_rcvbuf 来检查是否启用了自动调整。如果 tcp_moderate_rcvbuf 的值为 1,则启用自动调整。在这种情况下,接收缓冲区将由内核动态更新并绑定(bind)到/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

关于c - 套接字缓冲区大小不增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33775740/

相关文章:

c++ - C语言多线程串口编程

node.js - Node 冲突 : Nodejs -v works, 但不是 Node -v

c++ - 套接字始终断开 C++

C文件无法编译

c - 调试使用 libtiff 的 C 代码

linux - 如何在 Linux 上编译 QScintilla 和 Eric6?

java - Android App 无法通过 Socket 连接到 Java Server

perl - 如何在内存占用大的Perl守护程序中处理多个套接字?

c - 为什么会出现这个变量错误的错误呢?

c - 执行期间链表不复合