c - 为什么改变 SO_RCVBUF 的值不起作用?

标签 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 调用进行验证。

最佳答案

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

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

关于c - 为什么改变 SO_RCVBUF 的值不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063497/

相关文章:

Python 套接字客户端-服务器应用程序

python - python 中的文件到套接字适配器

javascript - 如何在文件中找到一系列字节并将它们替换为另一个缓冲区?

C 缓冲区溢出测试 - 64 位上不应该出现段错误?

c - 当服务器断开连接而不是进入无限循环时,如何让程序退出?

在 C 中连接 LPSTR

我的第一个程序的几个小问题

java - 使用 Java 字符数组处理 C 字符数组

buffer - st_buffer 不同距离的多点

传递给函数的参数损坏