1

使用 WinPcap 4.1.2,我需要在给定接口上收集所有基于 IP 的流量,然后过滤用户选择的基于 TCP 和 UDP 的“对话”以进行第 7 层处理。由于同时需要对每个传入帧进行唯一标记一次,我不能使用明显的解决方案,即让多个pcap_t设备为每个设备配备一个唯一的过滤器。相反,我使用单个pcap_t设备收集数据,标记每个帧,然后利用pcap_offline_filterAPI 在单独的线程中过滤每个选定的“对话”(即,X 对话将在 X 个不同的线程中过滤)以充分利用此应用程序将在其上运行的多核系统。

问题很简单。pcap_offline_filterAPI 线程安全吗?

4

1 回答 1

2

pcap_offline_filter()没有将由多个实例共享的全局数据,因此,只要您不在其他线程中修改其参数(没有理由这样做 - 例如,您不应该更改编译的过滤器结构,而在过滤过程中,或在过滤时更改数据包头或数据),它是线程安全的。

(pcap_compile()然而,它本身不是线程安全的;它基于 YACC 解析器和 Lex 词法分析器,我不认为 yacc 或 Bison,或 Lex 或 Flex 默认生成线程安全代码,代码生成器也具有全局变量。只需确保在同一个线程中编译过滤器表达式;然后您可以让多个线程使用这些表达式。我已经检查了 libpcap 主干的更改以将第一个参数设置为pcap_offline_filter()a const struct bpf_program *,以澄清它读取但不修改过滤器。这适用于该结构指向struct bpf_program的数组和数组。)struct bpf_insns

于 2012-11-24T20:19:18.660 回答