我有一个简单的模拟器,它从内核nfnetlink_queue子系统接收排队的数据包。可以使用recv()
函数通过循环处理传入的数据包:
(有关详情,请参阅here。示例代码在此处:http://www.netfilter.org/projects/libnetfilter_queue/doxygen/nfqnl__test_8c_source.html)
fd = nfq_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) >= 0) {
printf("pkt received\n");
nfq_handle_packet(h, buf, rv);
}
recv()
函数返回什么?我面临一个奇怪的问题:当它正常工作时,recv()
会返回1552
,突然会得到120
,而在下一次迭代中,它会得到-1
这意味着没有包。在我们不断发送数据包的情况下,-1
或者没有要读取的数据包不正确!任何意见?
答案 0 :(得分:1)
recv()可能返回-1并且errno设置为ENOBUFS,以防您的应用程序速度不足以从内核检索数据包。在这种情况下,您可以通过nfnl_rcvbufsiz()增加套接字缓冲区大小。虽然这会延迟ENOBUFS错误,但您可能迟早会再次发现它。