我有一个c ++应用程序,我正在启动另一个进程(wireshark),如下所示。
if (fp == NULL){
fp = popen(processpath, "r"); //processpath is the process I want to start
if (!fp){
throw std::invalid_argument("Cannot start process");
}
fprintf(fp, d_msg);//d_msg is the input I want to provide to process
} else if(fp != NULL){
fprintf(fp, d_msg);
}
问题是当我执行我的c ++应用程序时,它确实启动了wireshark但错误End of File on pipe magic during open
我应该怎么做才能避免这种情况?
此外,我尝试使用mkfifo创建命名管道并执行它。我使用过这样的东西:
if (fp == NULL){
system("mkfifo /tmp/mine.pcap");
fp = popen("wireshark -k -i /tmp/mine.pcap", "r");
if (!fp){
dout << "Cannot start wireshark"<<std::endl;
throw std::invalid_argument("Cannot start wireshark");
}
input = fopen("/tmp/mine.pcap", "wb");
fprintf(input , d_msg);
fclose(input);
} else if(fp != NULL){
input = fopen("/tmp/mine.pcap", "wb");
fprintf(input , d_msg);
fclose(input);
}
但这也行不通。有了这个,我得到以下错误:
The file "/tmp/wireshark_mine.pcap_20130730012654_ndbFzk" is a capture for a network type that Wireshark doesn't support
任何帮助都将不胜感激。
非常感谢。
答案 0 :(得分:2)
问题是当我执行我的c ++应用程序时,它确实启动了wireshark但错误
End of File on pipe magic during open
我应该怎么做才能避免这种情况?
你应该在管道上写一个pcap file或pcap-ng file,而不是打印一些东西。
这两种文件格式都是二进制。如果您正在构建自己的数据包,则必须先构造并向管道写入有效的pcap文件头或几个有效的pcap-ng块(节头块和至少一个接口描述块),然后才能写入任何数据包,然后,对于每个数据包,您必须先编写每个数据包的pcap标头或pcap-ng增强数据包模块的开始和结束(并且,对于增强模块,之后)原始分组数据。如果您只是将现有文件发送到Wireshark,则需要从文件中读取原始字节并将这些原始字节发送到管道中。