【问题标题】:libnetfilter_queue recv() functionlibnetfilter_queue recv() 函数
【发布时间】:2020-05-30 07:30:36
【问题描述】:

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

【问题讨论】:

    标签: linux network-programming iptables netfilter


    【解决方案1】:

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

    来源:libnetfilter_queue Documentation

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2014-05-05
      • 2023-03-17
      • 2019-07-14
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多