gpt4 book ai didi

c - pcap - 未接收流量 [OS X、El Capitan]

转载 作者:行者123 更新时间:2023-11-30 15:14:37 26 4
gpt4 key购买 nike

我正在创建一个软件交换机,作为一个学校项目。它是使用 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)),该行为是“不要将数据包从捕获机制传递到用户区,直到没有数据包”内核数据包缓冲区中下一个数据包的空间”,这意味着接收帧和将其传递到用户态之间的延迟可以是任意长的。

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,因此在任何操作系统上设置超时都是一个好主意。

关于c - pcap - 未接收流量 [OS X、El Capitan],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com