gpt4 book ai didi

c - 是否可以从缓冲区解析 pcap 数据包

转载 作者:太空狗 更新时间:2023-10-29 12:24:24 25 4
gpt4 key购买 nike

我有一堆用 lzma 压缩的巨大 pcap 文件(> 10GB)。我需要在我的机器上解析它们,但我没有足够的空间来先解压缩它们。有许多库可以从文件中流式传输 lzma。问题出在 libpcap 方面,我已经多次阅读它的 API,但找不到任何方法来解析缓冲区。我在库的源代码中看到的是它首先是 reads the magic bytefile header使用 fread:

    amt_read = fread((char *)&magic, 1, sizeof(magic), fp);
...
amt_read = fread(((char *)&hdr) + sizeof hdr.magic, 1, sizeof(hdr) - sizeof(hdr.magic), fp);

然后pcap_next_packet也使用了fread to read next packet from file .所以看起来很难将缓冲区从 lzma 流传递给它。另一方面,这些功能是stored in pcap_t structure as pointers .所以我可以为它实现我自己的程序,但是,这样我将不得不从 libpcap 中复制大量代码。有谁知道如何在不侵入 libpcap 的情况下做到这一点?

我是否遗漏了 libpcap API 中的某些内容?

更新:在@Martin 和其他人的帮助下,我设法让它工作了。我将发布实现,以便寻找实现方法的人可以使用它。

if (check_file_exists("/path/to/file.pcap.xz")) {
return;
}
// first open a pipe
FILE *pipe = popen("xz -d -c /path/to/file.pcap.xz", "r");
if (!pipe) {
// handle error somehow
return;
}
char errbuff[256];
// note pcap_fopen_offline function that takes FILE* instead of name
pcap_t *pcap = pcap_fopen_offline(pipe, errbuff);
struct pcap_pkthdr *header;
uint8_t *data;
while (pcap_next_ex(pcap, &header, &data)) {
// handle packets
}

最佳答案

特别是对于大型 pcap 文件,最好不要先将整个文件读入内存。要正确处理缓冲区管理,您需要了解 pcap 格式以获得正确的长度等。

您可以使用 popen 流式传输它,例如:

char* cmd = asprintf("/usr/bin/xz -d -c %s", filename);
FILE* fp = popen(cmd , "r");
free(cmd);

然后像未压缩一样从 fp 中读取。您还可以为 open 创建一个包装函数,返回一个 FILE* 来确定是通过扩展将其通过各种解压缩器进行管道传输,还是只执行普通的 fopen。

一般来说,我发现常规管道在可能的情况下比命名管道更可取,因为它可以节省 (a) 选择一个唯一的名称和 (b) 在所有错误情况下清理它们

或者只是手动解析 pcap,格式相当简单,IIRC 它只是一个 header 结构,然后每个数据包一个。

关于c - 是否可以从缓冲区解析 pcap 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46320975/

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