【发布时间】: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() ()
我猜它正在等待通过过滤器的数据包可用于轮询结束。但是有什么办法可以解决这个问题吗?
【问题讨论】: