是否有可能从缓冲区parsingpcap数据包

我有一大堆用lzma压缩的pcap文件(> 10GB)。 我需要在我的机器上parsing它们,而我没有足够的空间来先解压它们。 有很多libs可以从文件streamlzma。 问题是libpcap方面,我已经读了几次API,并找不到parsing缓冲区的任何方法。 我在libs的源代码中看到,它首先用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 从文件中读取下一个数据包 。 所以看起来很难从lzmastream向它传递一个缓冲区。 另一方面,这些函数作为指针存储在pcap_t结构中 。 所以我可以实现我自己的程序,但是,这样我将不得不从libpcap复制大量的代码。 有没有人知道如何做到这一点没有黑客进入libpcap?

我在libpcap API中丢失了什么?

更新:与@马丁和其他人的帮助下,我设法使其工作。 我将发布实现,所以寻找方法的人可以使用它。

 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读取,就好像它是未压缩的。 你也可以打开一个包装函数来返回一个FILE *,这个函数可以确定是否通过扩展来管理各种解压缩器,或者只是做一个简单的fopen。

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

或者只是手工解析pcap,格式是相当微不足道的,IIRC它只是一个头结构,然后每个数据包一个。