2

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

任何帮助,将不胜感激。

非常感谢。

4

1 回答 1

2

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

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

您应该将pcap 文件pcap-ng 文件写入管道,而不是 fprintfing。

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

于 2013-07-31T09:47:09.120 回答