代码之家  ›  专栏  ›  技术社区  ›  Pavel Davydov

可以从缓冲区解析pcap数据包吗

  •  3
  • Pavel Davydov  · 技术社区  · 7 年前

    reads the magic byte file 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 也使用 弗里德 to read next packet from file . 所以看起来很难将缓冲区从lzma流传递给它。另一方面,这些功能是 stored in pcap_t structure as pointers

    我在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
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   lunix    7 年前

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

    您可以使用popen进行流式处理,例如:

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

    然后从fp读取,就像它是未压缩的一样。您还可以创建一个包装函数,用于打开并返回一个文件*,以确定是通过扩展管道将其通过各种解压缩程序,还是只执行普通的fopen。