【问题标题】:pcap - not receiving traffic [OS X, El Capitan]pcap - 不接收流量 [OS X, El Capitan]
【发布时间】:2015-12-01 01:23:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: c macos networking pcap libpcap


    【解决方案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 和 libpcap 版本足够新以使用 TPACKET_V3 的 Linux 系统上,行为可能与内核或 libpcap 不支持的 Linux 版本完全不同t 使用 TPACKET_V3,因此在任何操作系统上设置超时都是一个好主意。

    【讨论】:

    • 谢谢,我什至不知道这样的功能存在,因为 pcap man 中没有提到它。但现在它工作正常。我还有一个问题,我怀疑这是真的,但只是为了澄清。 pcap_next() 是否接收到带有 pcap_inject() 的注入数据包?
    • "谢谢,我什至不知道有这样的功能,因为 pcap man 中没有提到它。"我会将它添加到主 pcap 手册页;它有自己的手册页。
    • “好的。我还有一个问题,我怀疑这是真的,但只是为了澄清一下。pcap_next() 是否收到了带有 pcap_inject() 的注入数据包?”请将此作为一个单独的问题提出;这是一个问答网站,而不是论坛,其想法是问题应该是独立的,以便用户可以找到已经被问和回答的问题(将问答网站视为众包常见问题解答)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 2017-06-11
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多