【问题标题】:libpcap: pcap_next_ex with "own" bufferslibpcap:带有“自己的”缓冲区的 pcap_next_ex
【发布时间】:2018-01-08 18:39:57
【问题描述】:

我目前做的事情如下:

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】:

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

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

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

    编辑

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

    【讨论】:

    • 关于pcap_next_expcap_loopthe code表示pcap_next_ex需要执行额外的复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2012-03-30
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多