最近在做一些協議分析的工作,常常和ETHREAL打交道。 我寫好自己的程式後,往往要放到真實的網路環境中去測試,看自己的通訊協定處理常式是否正確。反反覆複覺得很不爽。
於是考慮,如果可以把ETHREAL抓下來的資料直接作為測試資料使用,就方便多了。於是研究了一下CAP檔案的格式(見上篇文章),自己寫了一個讀取CAP檔案內容的類,公布給大家,希望能對你們有所用處。
具體的使用請看壓縮包中的README.TXT檔案,此代碼能同時在LINUX和WINDOWS上使用。
沒有辦法添加附件,請需要的朋友發郵件給我:ahfu@qq.com 可以從這裡下載:http://download1.csdn.net/down3/20070516/16191424179.rar
CapFileReader類使用說明
功能:讀取ethreal產生的CAP格式的檔案內的資訊
介面說明
CapFileReader(void); //預設建構函式
~CapFileReader(void); //解構函式
bool Open(const char* CapFile); //開啟CAP檔案,參數為檔案的路徑
bool Read(); //讀取下一個資料區段,達到檔案末尾返回false
void Close(); //關閉Cap檔案的讀取
inline unsigned short DataLength() const; //得到當前資料區段的資料長度,要先調用Read()方法
bool GetSourceMacAddr(char* Buffer, int Length); //得到當前資料區段的源網卡物理地址,要先調用Read()方法
bool GetDestMacAddr(char* Buffer, int Length); //得到當前資料區段的目的網卡物理地址,要先調用Read()方法
bool GetIPHeader(IP_HEADER& ip); //假設當前資料區段的協議是IP協議,獲得IP協議的頭資訊,要先調用Read()方法
bool GetIPData(int HeadLen, char* Buffer, int Length); //假設當前的資料區段的協議是IP協議,獲得IP協議的內容,要先調用Read()方法
bool GetInternetData(char* Buffer, int Length); //得到Internet協議的內容,包括ARP、IP等,要先調用Read()方法
inline time_t GetStartTime() const; //得到開始抓包的時間
inline unsigned int GetMicroSecond() const; //得到當前資料區段相對開始抓包時間的微秒數,要先調用Read()方法
inline unsigned short GetInternetProtocol() const; //得到當前資料區段的協議標識,要先調用Read()方法
使用樣本:
CapFileReader cap;
if (!cap.Open("1.cap"))
{
printf("File not exists!/n");
return;
}
IP_HEADER ip;
while (cap.Read())
{
if (cap.GetInternetProtocol()==PROTOCOL_IP)
{
if (!cap.GetIPHeader(ip))
{
printf("Get IP Header fail!/n");
continue;
}
if (ip.Proto == PROTOCOL_TCP)
{
printf("TCP/n");
}
else if (ip.Proto == PROTOCOL_UDP)
{
printf("UDP/n");
}
else
{
printf("IP/n");
}
}
else if (cap.GetInternetProtocol()==PROTOCOL_ARP))
{
printf("ARP/n");
}
else
{
printf("unknown/n");
}
}
cap.Close();