6

libpcap を使用せずに、pcap ファイル形式 ( format )に準拠したログ ファイルを書き込もうとしています。このファイルは、WireShark で読み取り可能である必要があります。これまでのところ、これを C++ で記述しました。

struct pcapFileHeader {
    uint32_t magic_number;   /* magic number */
    uint16_t version_major;  /* major version number */
    uint16_t version_minor;  /* minor version number */
    int16_t  thiszone;       /* GMT to local correction */
    uint32_t sigfigs;        /* accuracy of timestamps */
    uint32_t snaplen;        /* max length of captured packets, in octets */
    uint32_t network;        /* data link type */
};

ofstream fileout;
fileout.open("file.pcap", ios::trunc);

pcapFileHeader fileHeader;
fileHeader.magic_number = 0xa1b2c3d4;
fileHeader.version_major = 2;
fileHeader.version_minor = 4;
fileHeader.thiszone = 0;
fileHeader.sigfigs = 0;
fileHeader.snaplen = 65535; //(2^16)
fileHeader.network = 1;     //Ethernet

fileout <<  fileHeader.magic_number <<
            fileHeader.version_major <<
            fileHeader.version_minor <<
            fileHeader.thiszone <<
            fileHeader.sigfigs <<
            fileHeader.snaplen <<
            fileHeader.network;

fileout.close();

したがって、これにより空のキャプチャ ファイルが作成されるはずですが、Wireshark で開くと次のように表示されます。

ファイル「hello.pcap」は、パケットまたはその他のデータの途中で短く切断されたようです。

出力ファイルをバイナリ モードで開いてみましたが、解決しませんでした。これを WireShark フォーラムに投稿しますが、これはユーザー エラーであり、WireShark の問題ではないと思います。

助けていただければ幸いです。

4

1 に答える 1

3

<<テキストとしてフォーマットされた数値を書き込みます(たとえば、その数値を表す4バイトではなく5文字の文字列「65535」)。

バイナリデータを出力するには、でファイルを開き、ios::binaryを使用しますwrite。このステートメントは、ヘッダー全体を書き込みます。

fileout.write(reinterpret_cast<const char*>(&fileHeader),
              sizeof fileHeader);

エンディアンはリーダーによって検出されるため、構造体メンバー間にパディングがない限り、これは移植可能です。

である必要があることに注意してthiszoneくださいint32_t

于 2011-03-08T20:53:16.210 に答える