c-我可以将内存中的数据提交到pcap_loop()吗



以这个链接为指南,我编写了一个C程序,它将PCAP文件写入磁盘。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文件作为输入。(对于任何感兴趣的人来说,这个程序都是nDAP。(当我深入研究另一个程序的源代码时,我发现它使用pcap_loop()来分析PCAP输入。这是有道理的。当我手动将写入磁盘的PCAP文件提交给这个程序时,程序会完美地分析它们。

但是,将我的PCAP写入磁盘,然后从磁盘中读取它们太耗时了。我想要一个将u_char* pcapData存储在内存中并直接提交给pcap_loop()的解决方案。理论上,这应该是可行的。我想也许我可以用一个tmpfile()来做这个把戏。

但我的尝试失败了,就在呼叫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()时出错。永远无法访问回调函数。当我尝试在调试器(GDB(上进入pcap_loop()时,代码会立即出错。所以我真正知道的是pcap_loop()被我的PCAP文件的内存版本卡住了。我希望我知道为什么。

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

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

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

pcap_t是数据包供应商的描述符。

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

如果pcap_t是用pcap_open_offline()之类的调用打开的,该调用打开了一个pcap文件,它指的是一个文件,但它不是一个FILE *。(这不是我想说的,你说的这篇文章让你得出了这个结论;请仔细阅读。作为一名核心libpcap开发人员,我肯定知道pcap_t是什么,而不是。(

如果你想直接向nDPI提交数据包,而不需要写出文件并让它读取文件,如果nDPI可以从管道中读取,最好的方法是向管道中写入,正如你对另一个问题的评论所建议的那样。

对于任何关注此线程的人。。。解决方案是使用<pcap.h>文库pcap_fopen_offline()。这就是我的解决方案:

#include <pcap.h>
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 );
// ****************************************************
pcap_t* myPcapFile = pcap_fopen_offline( myTmpFile, errBuff );
// ****************************************************
if(pcap_loop( myPcapFile, 1, &myCallback, NULL) < 0){
printf("ERROR!n");
}
return 1;
}