9

我正在制作一个创建 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调用进行验证。

4

2 回答 2

17

如果操作系统似乎仍然无法正常工作,您也可能会受到操作系统的限制。检查以下值:

/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/

于 2012-04-08T15:04:12.610 回答
12

level论点setsockopt应该是SOL_SOCKET,而不是0

int a = 65535;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) {
    fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno));
}
于 2012-04-08T14:38:21.640 回答