天天看點

【VS開發】使用WinPcap程式設計(2)——打開網絡裝置并且開始捕獲資料包

這裡需要特别強調的一個資料結構是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等等各種不同的資訊。

      附上一個源代碼: