我在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
答案 0 :(得分:3)
您只需访问系统当前的sysctl限制net.core.wmem_max
和net.core.rmem_max
。
如果进程具有超级用户权限,则可以使用SO_SNDBUFFORCE
和SO_RCVBUFFORCE
ioctl来覆盖限制。如果您的服务确实需要更大的缓冲区(即除了糟糕的开发或设计选择之外的任何其他原因),那么我推荐这种方式。通常没有这样的原因,在这种情况下,我建议您修改应用程序/服务代码。
您可以在系统范围内修改限制,但它们会影响所有流程。通常情况下,默认设置可以正常工作,但在某些特殊情况下(可能是网络连接范围很广但长延迟的嵌入式服务器?),您可能希望修改它们。
要暂时执行此操作(直到下次启动),请以root身份运行sysctl -w net.core.wmem_max=bytes
和sysctl -w net.core.rmem_max=bytes
(其中bytes
是新的限制,以十进制数字为单位)。
要使更改成为永久更改,请添加
net.core.rmem_max=bytes
net.core.wmem_max=bytes
到您的/etc/sysctl.conf
文件,或者/etc/sysctl.d/
目录中的新文件,如果您的Linux发行版提供了一个。后者是更好的方法,因为它不会停止对默认配置文件的更新。
如果您想深入研究这些和其他套接字ioctl,可以查看内核net/core/sock.c
文件以及其中的sock_setsockopt()
函数。
答案 1 :(得分:1)
SO_RCVBUF
:允许的最大值由/proc/sys/net/core/rmem_max
文件
SO_SNDBUF
:允许的最大值由/proc/sys/net/core/wmem_max
文件设置。
因此,限制可能取决于您的系统配置方式。
答案 2 :(得分:0)
有趣的旁注。我编写了一个AF_ALG程序,该程序接受一个输入文件(将被随机选择),对其进行加密,解密,然后将解密后的纯文本与原始输入进行比较(使用cbc(aes))。 “测试”程序似乎挂在212992字节处。用ctrl-z中断程序,并放到后台,他们报告读取212992字节(我知道测试数据是错误的,在这种情况下为/ bin / zip,为215792字节)。
检查了net.core。[rmem_max,wmem_max,rmem_default,wmem_default],它们的值为212992。更新为2M,以前失败的测试开始工作。因此,这些限制似乎也会影响AF_ALG程序(我正在尝试公开一个加密加速器,并使用AF_ALG使其承受用户空间的压力)。