這裡需要特别強調的一個資料結構是pcap_t,它相當于一個檔案描述符,代表一個已經打開的裝置。我們對這個裝置進行操作,就是對這個檔案描述符進行操作。
首先是打開一個已知的裝置,使用pcap_open()這個函數,其原型如下:
1、source是我們所要打開的裝置。當我們擷取所有的裝置之後,這個source就是d->name。如果是檔案的話,就是檔案的名字,也是d->name。
2、snaplen是我們抓取的資料包的大小,100就是抓取整個資料包的前100bytes,65536最大,把整個包都包括了。不過有時候不管用(看裝置)。
3、flags是設定網絡裝置打開的狀态的,最重要的是PCAP_OPENFLAG_PROMISCUOUS,表示這個網絡裝置以混雜模式打開,可以捕捉區域網路中所有資料包。
4、read_timeout是設定延遲時間(milliseconds)用的。捕捉資料包的時候,延遲一定的時間,然後再調用核心中的程式,這樣效率較高。0表示沒有延遲,沒有包到達的時候永不傳回。-1表示立即傳回。
5、auth是遠端機器的登入資訊。本地機器則為NULL。
6、errbuf存儲出錯資訊。
return: 傳回這個打開裝置的描述符,如果出錯,傳回NULL。
打開裝置之後就要開始捕捉資料包了。pcap_loop()函數對捕捉到的資料包進行處理,每次處理一個資料包。其函數原型如下:
1、p就是我們打開的某個網絡裝置的描述符。
2、cnt是count,表示這個循環會總共處理多少個資料包。比如30,就是處理30個資料包。0表示沒有限定。
3、callback是一個函數指針,用來具體操作如何對資料包進行處理。
4、user是使用者資訊。我也不知道怎麼用,一般為NULL。
下面說一下上面函數中的函數指針,用來具體操作處理資料包。其定義如下:
1、user就是pcap_loop()函數中的user,一般也沒什麼用,在函數内部都用(VOID)user; 進行标記。
2、pkt_header是捕捉到這個資料包時WinPcap添加的一些資訊,有時間戳、捕捉到的包長度、實際包長度這些資訊。參看這裡。
3、pkt_data就是實際的資料包了,包括ethernet header, ip header, tcp header, real data等等各種不同的資訊。
附上一個源代碼: