函式名稱:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);
函式功能:捕獲數據包,不會回響pcap_open_live()函式設定的逾時時間
參數說明:p 是由pcap_open_live()返回的所打開的網卡的指針;cnt用於設定所捕獲數據包的個數;pcap_handler 是與void packet_handler()使用的一個參數,即回調函式的名稱;user值一般為NULL
pcap_loop原型是pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user)
其中第一個參數是winpcap的句柄,第二個是指定捕獲的數據包個數,如果為-1則無限循環捕獲。第四個參數user是留給用戶使用的。
第三個是回調函式其原型如下:
pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content)
其中參數packet_content表示的捕獲到的數據包的內容
參數argument是從函式pcap_loop()傳遞過來的。 注意:這裡的參數就是指 pcap_loop中的 *user 參數
參數pcap_pkthdr 表示捕獲到的數據包基本信息,包括時間,長度等信息.
另外:回調函式必須是全局函式或靜態函式,其參數默認,比如pcap_loop()可以寫成
pcap_loop(pcap_handle,10,pcap_callback,NULL)不能往裡面傳遞實參.
-----------------------------------------------------------------------------------------------------------------
pcap_loop和callback之間參數存在聯繫:
pcap_loop的最後一個參數user是留給用戶使用的,當callback被調用的時候這個值會傳遞給callback的第一個參數(也叫user),callback的最後一個參數p指向一塊記憶體空間,這個空間中存放的就是pcap_loop抓到的數據包。callback的第二個參數是一個結構體指針,該結構體定義如下:
struct pcap_pkthdr {
struct timeval ts; /* 時間戳 */
bpf_u_int32 caplen; /* 已捕獲部分的長度 */
bpf_u_int32 len; /* 該包的脫機長度 */
};
這個結構體是由pcap_loop自己填充的,用來取得一些關於數據包的信息
所以,在callback函式當中只有第一個user指針是可以留給用戶使用的,如果你想給callback傳遞自己參數,那就只能通過pcap_loop的最後一個參數user來實現了