pcap - 没有收到流量 [OS X, El Capitan]

pcap - not receiving traffic [OS X, El Capitan]

我正在创建一个软件交换机,作为一个学校项目。它是使用 lpcap 在 C 中实现的,并且在我的 Ubuntu 机器上运行良好(尽管存在一些错误)。但是我有一个 Mac 但它不能正常工作。

当使用 pcap_next_ex() 捕获帧时,捕获的帧数会增加。出于某种原因,在前几秒(5 到 30 秒)内,它不会增加帧数,就像没有收到任何帧一样,但我可以在 Wireshark 中看到这些帧。这怎么可能?

如果有兴趣,这里是我的代码。 https://github.com/Horkyze/Software-switch

For some reason during first few seconds (5 to 30) it doesn't increment number of frames, like no frames were received,

或者更确切地说,没有帧从捕获机制传递到 libpcap。

鉴于您没有设置超时,使用默认超时。它恰好为 0;超时的行为是平台相关的和未定义的,对于使用 BPF 的系统,例如 OS X(以及 *BSD 和 Solaris 11),该行为是 "don't pass packets from the capture mechanism to userland until there's no room for the next packet in the kernel packet buffer",这意味着延迟从接收帧到将帧传送到用户区之间的时间可以任意长。

Apple 的 pcap_set_timeout() 手册页对此更加强调(我将更改标准 libpcap 手册页以说明相同的内容:

   The behavior, if the timeout isn't specified, is undefined.  We  recom-
   mend always setting the timeout to a non-zero value.

鉴于您的应用程序名称中的 "switch",您可能根本不想要任何超时,而是想要 "immediate mode"。在即时模式下,设置 pcap_set_immediate_mode() 而不是 pcap_set_timeout(),数据包一到达就被传递到用户模式。

这也适用于 Ubuntu(包括即时模式,如果它是足够新的 Ubuntu 版本,它有一个带有即时模式的 libpcap 版本)。请注意,在具有足以实现 TPACKET_V3 的内核版本和足以使用 TPACKET_V3 的 libpcap 版本的 Linux 系统上,行为可能与以下版本完全不同Linux 内核或 libpcap 不会 做 TPACKET_V3,因此在 any[=27= 上设置超时是个好主意] OS.