首页 > 解决方案 > 我可以将内存中的数据提交给 pcap_loop() 吗?

问题描述

使用此链接作为指南,我编写了一个将 PCAP 文件写入磁盘的 C 程序。PCAP 包含完整的以太网/IP/TCP 数据包,带有有效负载。并且在我的程序完成后,我可以在 Wireshark 中手动读取生成的 PCAP 文件,所以我相信代码效果很好。这是伪代码:

int main(int argc, char ** argv ){

    u_char* pcapData = generatePCAPData();     // malloc()’s and creates the PCAP
                                               // file as a chunk of memory

    int sizeOfPcapData = getPcapLen( pcapData );

    FILE *fd = fopen( "myPcapFile.pcacp", "w" );
    fwrite( pcapData, sizeOfPcapData, 1, fd );
    fclose( fd );

    free( pcapData );

    return 1;
}

还有另一个程序可以进行数据包分析并接受 PCAP 文件作为输入。(该程序是 nDPI,对于任何感兴趣的人。)当我深入研究其他程序的源代码时,我发现它用于pcap_loop()分析 PCAP 输入。这就说得通了。当我手动将写入磁盘的 PCAP 文件提交给该程序时,该程序会完美地分析它们。

但是将我的 PCAP 写入磁盘然后从磁盘读取它们太耗时了。我希望有一个解决方案可以将其u_char* pcapData存储在内存中并将其直接提交给pcap_loop(). 从理论上讲,这应该有效。我想也许我可以使用 Ctmpfile()来解决问题。

但是我的尝试在调用pcap_loop(). 所以我尝试在我自己的代码中调用 pcap_loop,看看发生了什么。这是修改:

int main(int argc, char ** argv ){

    u_char* pcapData = generatePCAPData();         // as before

    int sizeOfPcapData = getPcapLen( pcapData );   // as before

    FILE* myTmpFile = tmpfile();
    if( myTmpFile == NULL )  return -1;

    fwrite( pcapData, sizeOfPcapData, 1, myTmpFile );

    if(pcap_loop( (pcap_t*)myTmpFile, 1, &myCallback, NULL) < 0){
        printf("ERROR!\n");
    }

    return 1;
}

上面的代码在调用pcap_loop(). 回调函数永远不会到达。当我尝试进入pcap_loop()我的调试器 (GDB) 时,代码会立即出现段错误。所以我真正知道的是,pcap_loop()我的 PCAP 文件的内存版本令人窒息。我希望我知道为什么。

所以……我的方法是错误的。以前有没有人处理过这样的问题?我不敢相信我是第一个。谢谢。

(仅供参考,我在 Ubuntu 平台上编码,使用 GCC 7.4.0)

完全披露:: 我也在这里发布了这个问题。

标签: cpcap

解决方案


Apcap_t是数据包提供者的描述符。

这些数据包可以来自文件,也可以来自捕获设备

如果pcap_t用诸如pcap_open_offline()打开 pcap 文件的调用打开的,它指的是一个文件,但它不是一个FILE *. (这不是我在你所说的导致你得出这个结论的帖子中要表达的意思;请更仔细地重新阅读它。作为核心 libpcap 开发人员,我肯定知道 apcap_t是什么 - 不是。)

如果您想直接将数据包提交给 nDPI,而不写出文件并让它读取文件,如果 nDPI 可以从管道读取,那么最好的方法是写入管道,正如您对另一个问题的评论问了这个建议。


推荐阅读