2011-03-08 396 views
6

不使用libpcap我想寫一個遵循pcap文件格式(format)的日誌文件。這個文件需要被WireShark讀取。到目前爲止,我已經用C++寫的是:如何編寫PCAP捕獲文件頭?

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中打開它,我與打招呼:

文件「你好.pcap「似乎在數據包或其他數據的中間被縮短了。

我試着在二進制模式下打開輸出文件,但沒有幫助。我會在WireShark論壇發佈這個,但我認爲這是用戶錯誤,WireShark沒有問題。

幫助將不勝感激。

回答

3

<<寫入格式爲文本的數字(例如,五個字符的字符串「65535」而不是表示該數字的四個字節)。

要輸出二進制數據打開文件與ios::binary和使用write。該聲明將寫入整個頭:

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

字節順序被讀取器檢測到,所以這是便攜式只要還有的結構成員之間沒有填充。

請注意,thiszone應該是int32_t

+0

而且,如果操作系統在一個重要的系統上,使用'ios :: binary'打開文件。 – nos 2011-03-08 21:37:12

+0

@nos - 好點,謝謝。 – aaz 2011-03-08 22:26:38