pcap_loop 及callback

對於最常用的 pcap_loop:

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)

其中參數pcap_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來實現了

 

發佈了11 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章