libpcap:pcap_next_ex,带有“自己的”缓冲区

问题描述 投票:2回答:1

我目前做的是以下内容:

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界面阅读,速度非常重要。我想对代码的某些部分进行基准测试,例如,使用自己的预分配数据包缓冲区而不是libpcap中的隐藏分配/缓冲区。

是否有一种方法或API使libpcap采用预先分配的缓冲区来将pcap_next_ex的结果写入?

c libpcap
1个回答
3
投票

从浏览libpcap source code看,似乎没有办法传递预先分配的缓冲区。但是,它可能已经在使用内部预分配的缓冲区。例如,对于Linux上的实时捕获,pcap_next_ex()深入调用pcap_read_packet()中的pcap-linux.c。在这里,您可以看到返回的指针只是属于捕获句柄的较大读取缓冲区的偏移量。我没有看过其他操作系统的实现,但我怀疑它们是相似的。

允许您传入自己的缓冲区要么需要平台实现将数据从自己的内部缓冲区复制到缓冲区(效率非常低),要么严重限制它们管理自己的系统调用缓冲的能力(内存映射,接收)每个系统调用多个数据包等)。无论哪种方式,这很可能不是您潜在优化的来源。

另请参阅this mailing list thread,其中讨论了pcap_next_ex()和较旧的pcap_loop()界面的相对性能。

编辑

interjay指出Linux实时捕获实现无论如何都要复制,因为要求缓冲区内容在调用后保持有效(参见pcap-linux.c的第4452行)。代码中的注释表明pcap_loop()可能确实更快,因为缓冲区仅暴露给回调函数,因此在回调返回后其内容不需要保持有效。

© www.soinside.com 2019 - 2024. All rights reserved.