gpt4 book ai didi

c - Linux 原始套接字缓冲区大小是否有 256 K 的上限?

转载 作者:太空狗 更新时间:2023-10-29 15:32:14 25 4
gpt4 key购买 nike

我在 Centos 中使用以下代码将原始套接字缓冲区大小更改为 400 KB,但是我得到的结果与将缓冲区大小设置为 256 KB 相同。哪里不对了?或者这是套接字层的限制?内核版本为2.6.34。谢谢!

int       rawsock;
socklen_t socklen;
int optval;
int bufsize = 400 * 1024;

rawsock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (rawsock < 0) {
my_log(LOG_ERR, "error creating raw socket");
return rawsock;
}

optval = 0;
socklen = 4;
err = getsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &optval, &socklen);
bail_error(err);
my_log("socket RX original buffer size = %d", optval);

optval = 0;
socklen = 4;
err = getsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, &optval, &socklen);
bail_error(err);
my_log("socket TX original buffer size = %d", optval);

err = setsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));
bail_error(err);

err = setsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize));
bail_error(err);

optval = 0;
socklen = 4;
err = getsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &optval, &socklen);
bail_error(err);
my_log("socket RX new buffer size = %d", optval);

optval = 0;
socklen = 4;
err = getsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, &optval, &socklen);
bail_error(err);
my_log("socket TX new buffer size = %d", optval);

运行后结果为:

socket RX original buffer size = 110592
socket TX original buffer size = 110592
socket RX new buffer size = 524288
socket TX new buffer size = 524288

最佳答案

您刚刚达到系统当前的 sysctl 限制 net.core.wmem_maxnet.core.rmem_max

如果进程具有 super 用户权限,它可以使用 SO_SNDBUFFORCESO_RCVBUFFORCE ioctl 来覆盖限制。如果您的服务确实需要更大的缓冲区有真正的原因——也就是说,除了糟糕的开发或设计选择之外的任何其他原因——那么我推荐这种方式。通常没有这样的原因,在这种情况下,我建议您改为修复应用程序/服务代码。

您可以在系统范围内修改限制,但它们会影响所有进程。通常默认值工作正常,但在某些特殊情况下(嵌入式服务器具有非常广泛但延迟时间长的网络连接,也许?)您可能希望修改它们。

要临时执行此操作(直到下次启动),运行 sysctl -w net.core.wmem_max=bytessysctl -w net.core.rmem_max=bytes 作为root(其中 bytes 是十进制数的新限制,以字节为单位)。

要使更改永久生效,请添加

net.core.rmem_max=bytes
net.core.wmem_max=bytes

到您的 /etc/sysctl.conf 文件,或者如果您的 Linux 发行版提供了一个新文件到 /etc/sysctl.d/ 目录。后者是更好的方法,因为它不会停止对默认配置文件的更新。

如果您想更深入地研究这些和其他套接字 ioctl,可以查看内核 net/core/sock.c文件,以及其中的 sock_setsockopt() 函数。

关于c - Linux 原始套接字缓冲区大小是否有 256 K 的上限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com