上兩節(jié)已經(jīng)介紹了ARP協(xié)議、IP協(xié)議的一些理論內(nèi)容,本節(jié)主要介紹winpcap庫的安裝與使用。
四、winpcap庫用法
winpcap驅(qū)動程序以及winpcap開發(fā)包下載地址:
下載之后還需要對開發(fā)環(huán)境做一些配置,本次軟件實現(xiàn)所用的前期環(huán)境是VC6.0后期向VS2005平臺進行了移植。
下載后可以看到兩個文件,一個是WinPcap_4_0_2.exe這個是驅(qū)動程序,首先雙擊安裝驅(qū)動程序。
其中要用到pcap_findalldevs函數(shù),它是這樣定義的
int pcap_findalldevs ( pcap_if_t ** alldevsp,
char * errbuf
)
功能:
枚舉系統(tǒng)所有網(wǎng)絡設備的信息
參數(shù): alldevsp:是一個pcap_if_t結(jié)構(gòu)體的指針,如果函數(shù)pcap_findalldevs函數(shù)執(zhí)行成功,將獲得一個可用網(wǎng)卡的列表,而里面存儲的就是第一個元素的指針。
Errbuf: 存儲錯誤信息的字符串
返回值: int : 如果返回0 則執(zhí)行成功,錯誤返回 -1。
打開相應網(wǎng)卡并設置為混雜模式:
在此之前肯定要有一段讓用戶選擇網(wǎng)卡、并獲得用戶選擇的網(wǎng)卡的名字的代碼,既然上面已經(jīng)可以獲得所有網(wǎng)卡的名字了,這段代碼就暫且略過了。
我們主要是要用到 pcap_open_live 函數(shù),不過這個函數(shù)winpcap的開發(fā)小組已經(jīng)建議用pcap_open 函數(shù)來代替,不過因為我的代碼里面用的就是pcap_open_live,所以也不便于修改了,不過pcap_open_live使用起來也是沒有任何問題的,下面是pcap_open_live的函數(shù)聲明:
雖然看起來比較復雜,不過用起來還是非常簡單的,其實 1 行就OK了:
pcap_t* adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
// 打開網(wǎng)卡,并且設置為混雜模式
// pCardName是前面?zhèn)鱽淼木W(wǎng)卡名字參數(shù)
adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);
編譯過濾設備
pcap_compile(pcap_t* adhandle, struct bpf_program * fcode,
char *filter,int optimize,netmask)
設置過濾器
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
/***************************************************************
int pcap_next_ex ( pcap_t * p,
struct pcap_pkthdr ** pkt_header,
u_char ** pkt_da
)
功能:
從網(wǎng)卡或者數(shù)據(jù)包文件中讀取數(shù)據(jù)內(nèi)容
參數(shù):
pcap_t * p: 網(wǎng)卡句柄
struct pcap_pkthdr ** pkt_header: 并非是數(shù)據(jù)包的指針,只是與數(shù)據(jù)包捕獲驅(qū)動有關(guān)的一個Header
u_char ** pkt_da
返回值:
1 : 如果成功讀取數(shù)據(jù)包
0 :pcap_open_live()設定的超時時間之內(nèi)沒有讀取到內(nèi)容
-1: 出現(xiàn)錯誤
-2: 讀文件時讀到了末尾
pcap_next_ex()不是基于回調(diào)機制的,直接調(diào)用這個函數(shù)就可以抓到一個數(shù)據(jù)包,如果我們把pcap_next_ex()嵌套在一個for循環(huán)或者while循環(huán)內(nèi)的話,程序的結(jié)構(gòu)會很明晰,而且不使用回調(diào)也會節(jié)省一些時間。
以上介紹了Winpcap庫中的主要函數(shù),具體實現(xiàn)請查看程序代碼,后文將提供代碼下載。下一節(jié)將主要介紹如何使用MFC實現(xiàn)本軟件,以及在可視化實現(xiàn)時的幾個“難點”。
聯(lián)系客服