c++ - libpcap:接收帧和调用回调函数之间的延迟

标签 c++ c linux-kernel libpcap

我遇到了以下情况: 我用 pcap_open_live() 打开我的网络接口(interface)之一。然后我正在为 pcap 编译一个过滤器,只捕获指定的以太网类型(ether proto 0x1234)。现在我开始 pcap_loop()。回调函数执行的唯一一件事是通过 pcap_inject() 发送一个帧。 (框架被硬编码为全局字符数组)。

当我现在比较接收帧和发送帧的时间戳时(例如,在第三台非相关计算机上的 wireshark 上),延迟大约为 3 毫秒(最小 1 毫秒,但也最多 10 毫秒)。所以 pcap 平均需要大约 3 毫秒来处理接收到的帧并调用回调函数来发送新帧。 我想/必须减少延迟。

以下是我已经尝试过的:

  • pcap_open_live() 中尝试了所有不同的read-timout (in ms) 变体:甚至是 -1 的 read-timout,据我所知这应该是轮询,产生大约 3 毫秒的延迟
  • 不设置过滤器
  • 设置更高的处理优先级
  • 设置 InterrupThrottleRate=0e1000/e1000e 内核模块的其他参数以强制硬件为每一帧发送一个中断

但我从未将延迟降低到平均 3 毫秒以下。

对于我计划的应用程序,有必要在 100 微秒 的时间内对传入的数据包使用react。 对于 libpcap,这甚至通常可行吗?!或者还有其他实现此类应用的建议吗?

谢谢大家的回复 我希望有人能帮助我!

注意:我在 Linux/Ubuntu 下用 C/C++ 部署。

最佳答案

For my planned application it is necessary to react to incoming packets in a time under 100 microseconds.

然后是 libpcap 运行的许多捕获机制(AIX 上的 BPF 除外,具有更新的 libpcap 和内核的 Linux 上的 TPACKET_V3,Solaris 10 和更早版本上的 DLPI 等)提供的缓冲,以减少每个数据包的开销会妨碍您。

如果您系统上的 libpcap 具有 pcap_set_immediate_mode() 函数,则:

  • 使用pcap_create()pcap_activate(),而不是pcap_open_live(),打开捕获设备;
  • pcap_create()pcap_activate() 调用之间调用 pcap_set_immediate_mode()

在“立即模式”下,捕获机制应在捕获机制接收到数据包后立即将其传递给应用程序。

关于c++ - libpcap:接收帧和调用回调函数之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36597189/

相关文章:

linux - 在 linux 驱动程序中,为什么在函数中传递数据指针时 kfree 不起作用?

c++ - C++ Goto vs Std::function lambda? [closed]

c++ - Com口写读方法

c - 如何在结构中使用 union ,并为每个结构定义不同的 union 类型?

c - 在 C 中创建降序堆排序时遇到问题

单个 C 头文件中的循环依赖。需要前向声明吗?

c - 内核模块和用户应用程序使用的库

c - 在工作队列中使用 spin_lock() 与 down_interruptible()

c++ - 自定义内存分配器 : T* pointer, operator new 与 void pointer cast

c++ - 打印字符数组 C++