我正在制作一个程序,它创建一个原始套接字以读取所有流量。在调用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”的值通过 a 进行验证getsockopt
call.
如果操作系统似乎仍然无法正常工作,您也可能受到操作系统的限制。检查以下值:
/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/ http://fasterdata.es.net/fasterdata/host-tuning/linux/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)