为什么更改SO_RCVBUF的值不起作用?

时间:2012-04-08 14:22:15

标签: c sockets buffer setsockopt

我正在制作一个创建RAW套接字的程序,以便读取所有流量。在socket()和recvfrom()的调用之间(最后一个是在循环中从缓冲区中取出所有数据包)我等待5秒。

当我运行程序时,我用“快速模式”(快速填充缓冲区)中的hping3命令向我的程序发送大约200个数据包。一旦经过5秒,我的程序就会从缓冲区中提取大约150个数据包。

我尝试更改接收缓冲区的大小以获得更好的结果:

int a = 65535;
if ( (setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int)) ) < 0 )
{
    fprintf(stderr, "Error setting sock opts..\n");
}

然而,无论是«a»,1还是10000000的值,似乎都没有变化,我仍然可以从缓冲区获得~150个数据包。

有什么问题?

编辑:«a»的值通过getsockopt来电验证。

2 个答案:

答案 0 :(得分:16)

如果操作系统似乎仍然不起作用,您可能也会受到操作系统的限制。检查以下值:

/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max

如果你的示例中是TCP,而不是实际的原始套接字,你也可以检查以下值:

/proc/sys/net/ipv4/tcp_mem

如果您对这些文件运行cat,它们将显示当前设置。要永久更改它们,请使用sysctl。在开始更改之前写下这些设置是个好主意。以下是有关进行这些更改的精彩教程:http://fasterdata.es.net/fasterdata/host-tuning/linux/

答案 1 :(得分:8)

level的{​​{1}}参数应为setsockopt,而不是SOL_SOCKET

0