打开期间管道魔法的文件结束

时间:2013-07-31 09:05:19

标签: c++ linux pipe wireshark popen

我有一个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

任何帮助都将不胜感激。

非常感谢。

1 个答案:

答案 0 :(得分:2)

  

问题是当我执行我的c ++应用程序时,它确实启动了wireshark但错误End of File on pipe magic during open

     

我应该怎么做才能避免这种情况?

你应该在管道上写一个pcap filepcap-ng file,而不是打印一些东西。

这两种文件格式都是二进制。如果您正在构建自己的数据包,则必须先构造并向管道写入有效的pcap文件头或几个有效的pcap-ng块(节头块和至少一个接口描述块),然后才能写入任何数据包,然后,对于每个数据包,您必须先编写每个数据包的pcap标头或pcap-ng增强数据包模块的开始结束(并且,对于增强模块,之后)原始分组数据。如果您只是将现有文件发送到Wireshark,则需要从文件中读取原始字节并将这些原始字节发送到管道中。