我正在创建一个软件开关,作为一个学校项目。它是使用lpcap在C中实现的,并且在我的Ubuntu机器上工作正常(尽管存在一些错误)。但是我有一台Mac,它不应该在那里工作。
使用pcap_next_ex()捕获帧时,捕获的帧数会增加。出于某种原因,在最初的几秒钟(5到30)内,它不会增加帧数,就像没有收到帧一样,但是我可以在Wireshark中查看这些帧。这怎么可能?
如果有兴趣,这是我的代码。 https://github.com/Horkyze/Software-switch
答案 0 :(得分:1)
出于某种原因,在最初的几秒钟(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版本)。请注意,在具有足以实现TPACKET_V3的内核版本的Linux系统和足以使用TPACKET_V3的libpcap版本的Linux系统上,行为可能与内核或libpcap 不具备的Linux版本完全不同。 39; t 执行TPACKET_V3,因此在任何操作系统上设置超时是一个好主意。