我正在创建一个软件交换机,作为一个学校项目。它使用lpcap在C中实现,并且可以在我的Ubuntu机器上正常运行(尽管有一些错误)。但是,我有一台Mac,它无法正常运行。
使用pcap_next_ex()捕获帧时,捕获的帧数会增加。由于某些原因,在最初的几秒钟(5到30)中,它不会增加帧数,就像没有收到帧一样,但是我可以在Wireshark中看到那些帧。这怎么可能?
如果有兴趣,这里是我的代码。
https://github.com/Horkyze/Software-switch
最佳答案
由于某些原因,在最初的几秒钟内(5到30),它不会增加帧数,就像没有收到帧一样,
或者,更确切地说,就像没有任何帧从捕获机制传递到libpcap一样。
鉴于您未设置超时,将使用默认超时。恰好是0;超时行为是与平台有关的且未定义,对于使用BPF的系统(例如OS X(以及* BSD和Solaris 11)),该行为是“不要将数据包从捕获机制传递到用户态,直到没有“在内核数据包缓冲区中为下一个数据包留出空间”,这意味着帧接收到将其传送到用户域之间的延迟可能任意长。
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.
给定应用程序名称中的“开关”,您可能根本不需要任何超时,而需要“立即模式”。在即时模式中,使用
pcap_set_immediate_mode()
而不是pcap_set_timeout()
进行设置,数据包一到达便立即传送到用户模式。这也将在Ubuntu上运行(如果是足够新的Ubuntu版本,并且具有具有立即模式的libpcap版本,则包括立即模式)。请注意,在Linux系统上内核版本足以实现TPACKET_V3,而libpcap版本足以使用TPACKET_V3,其行为可能与内核或libpcap都不执行TPACKET_V3的Linux版本完全不同。 ,因此在所有操作系统上设置超时都是一个好主意。
关于c - pcap-未收到流量[OS X,El Capitan],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34011043/