libnetfilter_queue recv()函数

时间:2014-07-10 18:17:31

标签: linux network-programming iptables netfilter

我有一个简单的模拟器,它从内核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或者没有要读取的数据包不正确!任何意见?

1 个答案:

答案 0 :(得分:1)

recv()可能返回-1并且errno设置为ENOBUFS,以防您的应用程序速度不足以从内核检索数据包。在这种情况下,您可以通过nfnl_rcvbufsiz()增加套接字缓冲区大小。虽然这会延迟ENOBUFS错误,但您可能迟早会再次发现它。

来源:libnetfilter_queue Documentation