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