2

次のような別のプロセス(wireshark)を開始するC++アプリケーションがあります。

   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

それを避けるために私は何をすべきですか?

何かを fprintfing するのではなく、pcap ファイルまたはpcap-ng ファイルをパイプに書き込む必要があります。

これらのファイル形式はどちらもバイナリです。独自のパケットを作成する場合は、パケットを書き込む前に、有効な pcap ファイル ヘッダーまたは複数の有効な pcap-ng ブロック (セクション ヘッダー ブロックと少なくとも 1 つのインターフェイス記述ブロック) を作成してパイプに書き込む必要があります。次に、パケットごとに、パケットごとの pcap ヘッダーまたは pcap-ng 拡張パケット ブロックの先頭末尾を生のパケット データの前 (および拡張ブロックの場合は後) に書き込む必要があります。既存のファイルを Wireshark に送信するだけの場合は、ファイルから raw バイトを読み取り、それらの raw バイトをパイプに送信する必要があります。

于 2013-07-31T09:47:09.120 に答える