gpt4 book ai didi

c - libpcap:带有 "own"缓冲区的 pcap_next_ex

转载 作者:行者123 更新时间:2023-12-05 04:08:01 29 4
gpt4 key购买 nike

我目前做的是:

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/

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