c - 我可以将内存中的数据提交给 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)
完全披露:: 我也在这里发布了这个问题。
解决方案
Apcap_t
是数据包提供者的描述符。
这些数据包可以来自文件,也可以来自捕获设备。
如果是pcap_t
用诸如pcap_open_offline()
打开 pcap 文件的调用打开的,它指的是一个文件,但它不是一个FILE *
. (这不是我在你所说的导致你得出这个结论的帖子中要表达的意思;请更仔细地重新阅读它。作为核心 libpcap 开发人员,我肯定知道 apcap_t
是什么 - 不是。)
如果您想直接将数据包提交给 nDPI,而不写出文件并让它读取文件,如果 nDPI 可以从管道读取,那么最好的方法是写入管道,正如您对另一个问题的评论问了这个建议。
推荐阅读
- jose - 错误:导入“pem”密钥时没有密钥导入程序
- powershell - Powershell 条件
- javascript - 正则表达式提取 - 混合十进制分隔符
- javascript - 并排的 knitr/rmarkdown 图表和标题
- r - 从 R 中的幂律分布中提取随机数
- javascript - 为什么这些转换后的画布在某些分辨率下不能以 chrome 完整呈现?
- vue.js - vue 组件在兄弟姐妹中检测自己的索引
- javascript - 创建网站页面实时外观的图像
- ballerina - Ballerina:拉新发行版后不兼容的依赖关系
- javascript - React hooks:使用 Promise 设置属性会导致所有 obj 属性在 useState 中更改的效果吗?