【问题标题】:pcap_dispatch stuck with network filter setpcap_dispatch 卡在网络过滤器集上
【发布时间】:2021-01-15 02:03:23
【问题描述】:

当我使用环回设备“lo”运行我的程序并应用了一些过滤器时,它会挂在轮询调用中(参见下面的 gdb)。如果跳过 pcap_compile() 和 pcap_setfilter() 调用,则不会发生这种情况,并且其他网络设备也不会发生这种情况。 pcap_dispatch 在循环中被调用。程序按顺序调用这些 libpcap 函数:

1. pcap_create("lo", errbuf)
2. pcap_set_promisc(handle, 0)
3. pcap_set_snaplen(handle, 65000)
4. pcap_set_timeout(handle, 1000)
5. pcap_activate(handle)
6. pcap_lookupnet("lo", &localnet, &mask, errbuf)
7. pcap_compile(handle, &fp, "port 12345", 0, mask)
8. pcap_setfilter(handle &fp)
9. pcap_dump_open(handle, file)
10. pcap_dispatch(handle, 5, packet_handler, dumpObject)

它卡在 pcap_dispatch 并且不会返回。我试图调用 pcap_breakloop() 但这不起作用。仅当没有编译和设置过滤器(对于环回设备)时,调用随机数据包的 pcap_inject() 才有效。这是回溯(省略/更改了一些细节):

#0  __GI___poll (timeout=-1, nfds=1, fds=[some address]) at .xxxx/poll.c:29
#1  __GI___poll (fds=[some address], nfds=1, timeout=-1) at .xxxx/poll.c:26
#2  in pcap_wait_for_frames_mmap () from /libpcap.so.1
#3  in pcap_read_linux_mmap_v3 () from /libpcap.so.1
#4  in execute() ()

我猜它正在等待通过过滤器的数据包可用于轮询结束。但是有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: c++ c pcap


    【解决方案1】:

    这似乎是 1.10.0 之前的版本中的问题。从 1.10.0 开始,发出 pcap_breakloop() 将强制 poll() 调用结束并导致 pcap_dispatch 返回 PCAP_ERROR_BREAK。

    如果使用旧版本,一个快速的解决方案是在 pcap_activate() 之后调用 pcap_setnonblock(),然后在 pcap_dispatch() 调用之间休眠一组毫秒/秒。这有助于不使 pcap_dispatch() 的循环过载。您可以使用“0”调用 pcap_dispatch() 或在这种情况下需要许多数据包,并且它们应该在下次调度时可用。然后,您可以使用 pcap_breakloop() 或您自己的机制取消循环。

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2019-11-03
      • 2023-03-08
      • 2015-03-26
      相关资源
      最近更新 更多