- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前做的是:
struct pcap_pkthdr *phdr;
const u_char *data;
pcap_next_ex(descriptor, &phdr, &data);
memcpy((void*)mybuf, phdr, sizeof(*phdr));
memcpy((void*)mybuf + sizeof(*phdr), data, phdr->len);
但我想做的是下面的,即提供一个预分配的缓冲区。
u_char mybuf[2048];
pcap_next_ex(descriptor, mybuf, mybuf + 16); // 16 is size of pkthdr
第二个示例由于错误的指针类型而无法编译,但我认为这样可以更好地理解我的问题。我正在从 10G 接口(interface)读取,速度非常重要。我想对代码的某些部分进行基准测试,例如,使用自己的预分配数据包缓冲区而不是 libpcap 中的隐藏分配/缓冲区。
有没有办法或 API 让 libpcap 使用预分配的缓冲区来写入 pcap_next_ex 的结果?
最佳答案
看一眼 libpcap source code似乎没有办法传递预分配的缓冲区。但是,它很可能已经在使用内部预分配的缓冲区。例如,对于 Linux 上的实时捕获,pcap_next_ex()
深入到对 pcap-linux.c
中的 pcap_read_packet()
的调用。 .在这里您可以看到返回的指针只是一个更大的属于捕获句柄的读取缓冲区的偏移量。我没有看过其他操作系统的实现,但我怀疑它们是相似的。
允许您传入自己的缓冲区将需要平台实现将数据从它们自己的内部缓冲区复制到您的缓冲区(效率非常低),或者严重限制它们管理自己的系统调用缓冲等(内存)的能力映射、每个系统调用接收多个数据包等)。无论哪种方式,这很可能不是您潜在优化的来源。
另见 this mailing list thread其中讨论了 pcap_next_ex()
和较旧的 pcap_loop()
接口(interface)的相对性能。
interjay 指出,Linux 实时捕获实现无论如何都会创建一个副本,因为要求缓冲区内容在调用后保持有效(参见 pcap-linux.c
的第 4452 行)。代码中的注释表明 pcap_loop()
可能确实更快,因为缓冲区只暴露给回调函数,因此它的内容不需要在回调返回后保持有效。
关于c - libpcap:带有 "own"缓冲区的 pcap_next_ex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48156235/
我尝试使用 libpcap 读取原始数据包(CentOS 6 上为 1.4.0)。 但是,由于某些原因,在 pcap_next_ex() 之后 rawPacket 始终为 NULL。 但是,pcap_
免责声明:这是一项家庭作业,但问题与作业无关,只是关于一般的语法怪异。 我试图在一个更大的程序的上下文中使用 libpcap,但是当我尝试获取每个数据包的数据包头和数据时,gcc 提示 pcap_ne
我目前做的是: struct pcap_pkthdr *phdr; const u_char *data; pcap_next_ex(descriptor, &phdr, &data); memcpy
我正在分析一个 pcap 文件(离线模式)。首先,我需要计算文件中已包含的数据包数。为此,我使用“pcap_next_ex()”来遍历文件并且总是工作正常。我的第二个目的是挑选出每个数据包时间戳,所以
我有一个问题,假设我有一个线程可以捕获数据包并自行处理它们。 使用 pcap_next_ex:我会使用一个循环,我会在每次交互中处理数据包,假设我调用 Sleep(200) 来模拟这些东西。使用 pc
我使用读取存储在文件中的数据包 struct pcap_pkthdr *header; const u_char *packetData; pcap_next_ex(pcap, &header, &p
我在项目中看到了这种代码: while (1) { l_numPkts = pcap_next_ex( m_pcapHandle, &header, &pkt_data); //do some
我正在构建一个网络嗅探器,它将在 PFSense 上运行以监控 IPsec VPN。我在 FreeBSD 8.4 下编译。 我选择使用 C 语言的 libpcap 作为数据包捕获引擎,使用 Redis
我有一个正在运行的应用程序需要在我的本地平台上正确执行,运行 Ubuntu 18.4,并重新编译,在 FreeBSD 平台上运行。 我遇到了数据包问题,因为在 FreeBSD 平台上以太网报头短了 1
我是一名优秀的程序员,十分优秀!