1. 程式人生 > >Winpcap的安裝使用方法和問題總結

Winpcap的安裝使用方法和問題總結

Winpcap的安裝使用方法

   1.到http://www.winpcap.org/install/default.htm下載winpcap的安裝包,然後到http://www.winpcap.org/devel.htm程式設計師開發包。
   2.執行安裝包,這樣你的機子就能執行winpcap程式了。
   3.解壓開發包,在VC6.0的Tools-->Option-->Directories的Include fils 和library files加入winpcap的include和lib目錄。
   4.開始編寫wpcap程式。

vs2005:
第一步:下載WinPcap的安裝包;有不同作業系統環境下的包,我下的是win32版本的。下載地址:

www.winpcap.org;最新的Release版本是4.0.1的,最高的版本一般是Beta的。這個安裝包主要是註冊一個wpcap.dll的庫到作業系統中。必須安裝,如果不安裝,在執行例子的時候會彈出視窗提示,找不到wpcap.dll檔案;
第二步:到上面的網站下載它的開發包,包括一些標頭檔案和庫檔案;解壓到自己指定的目錄中;目錄中還有HTML格式的說明文件,用於自己學習比較方便;
第三步:設定VS2005;1)設定環境目錄;在選單:工具->選項;彈出的選項窗體左邊點選:專案和解決方案->VC++目錄;在右邊:“顯示以下內容的目錄”標籤下面的下拉框中找到“包含檔案”,然後對應到第二步下載開發包的Include目錄;在同一下拉框中找到“庫檔案”,然後對應到第二步下載開發包的lib目錄;2)設定編譯條件;在專案屬性頁中:配置屬性->C/C++->前處理器->前處理器定義,增加;WPCAP;HAVE_REMOTE;每一個預定義符用";"隔開;在專案屬性頁中:配置屬性->連結器->命令列->附加選項對應的文字框中增加:“wpcap.lib ws2_32.lib”;

第四步:非必要步驟;有的時候可能會有些意外錯誤;比如找不到u_char型別等;我的解決辦法是加上
#ifndef WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#else
#include <winsock.h>
#endif

=================================================================================

winpcap開發包使用中的問題總結

這裡主要討論一下winpcap開發中可能遇到的問題。winpcap開發包在使用中還是會有一些容易被忽略的問題的,由於這些問題可能讓您在開發中產生一些莫名奇妙的結果。

    首先,我們從winpcap的環境配置中可能出現的錯誤開始。

   winpcap開發環境需要是windows作業系統,而且必須安裝winpcap驅動才可以除錯您的程式。

如果編譯的時候出現Cannot open include file: 'pcap.h': No such file or directory等類式找不到檔案的錯誤,請察看是否加入了winpcap開發包的include資料夾。VC6下的加入方法是Tools->options->Directories裡面加入下載的winpcap開發包解壓以後的include資料夾.

如果連結的時候出現fatal error LNK1104: cannot open file "wpcap.lib"等問題,請察看是否加入了winpcap開發包的lib資料夾.VC6下的加入方法是Tools->options->Directories的lib裡面加入下載的winpcap開發包解壓以後的lib資料夾.

如果連結的時候出現error LNK2001: unresolved external symbol _pcap_findalldevs等問題,請察看link中是否加入了wpcap.lib.VC6下的加入方法是Project->Settings->Link的Objects/library modules裡面加入wpcap.lib。

接下來是使用winpcap開發包中的一些函式的問題。

        1。用pcap_lookupnet時發現網絡卡的IP和掩碼都是0.0.0.0並且無法捕捉。出現這個問題很多是因為使用了pcap_lookupdev這個函式。最好不要使用pcap_lookupdev這個函式,這個函式也是winpcap開發手冊中不推薦使用的,因為在實際使用中我們會發現很多機器在查詢網絡卡時都能找到一個虛擬的網絡卡,而且這個很多時候都在第一個位置,這樣向下一步提交裝置控制代碼的時候就已經傳錯了。推薦您使用pcap_findalldevs返回一個網絡卡列表,然後找到您需要的正常網絡卡。這樣也適合向多網絡卡移植。

        2。在使用了pcap_findalldevs,並且除錯時發現已經是正常網絡卡,可是還是無法捕獲。出現這個問題請您在除錯時看看是否網絡卡的前面還有如:rpcap://這樣的欄位,這可能是因為您沒有注意pcap_findalldevs,pcap_findalldevs_ex,pcap_open,pcap_open_live這幾個函式的區別的原因,請您參考winpcap開發手冊,裡面有這樣的欄位The following formats are not allowed as 'source' strings:

rpcap:// [to open the first local adapter] 
rpcap://hostname/ [to open the first remote adapter] 
在上面的2種找網絡卡,和開啟方式中,有的開啟是沒有rpcap://這種欄位的,有的卻有,有沒有這個欄位,後面的操作是不一樣的,有的需要使用pcap_createsrcstr()來建立正確的欄位,所以您一定要注意了。

      3。以上都沒有問題,可是還是抓不到包,好像winpcap沒有工作。請您察pcap_open或pcap_open_live函式中的延遲引數設定,一般設到1000(ms),因為如果您是在主執行緒下捕獲,延遲設定過小(一般200ms以下就不穩定了)會使winpcap無法工作,多執行緒下沒有這個問題,設到1都可以正常工作。

     4。在MFC下開發的問題,不要使用在Dos下開發時常用的pcap_loop而要選用pcap_next_ex等替代函式,這樣才不會有回掉函式的那個問題。可以參看winpcap開發手冊其中有如下說明:

The callback-based capture mechanism of pcap_loop() is elegant and it could be a good choice in some situations. However, handling a callback is sometimes not practical -- it often makes the program more complex especially in situations with multithreaded applications or C++ classes.

恩,就寫到這裡吧,其他的問題現在我還沒有遇到,如果有誰遇見了新的問題請發到這裡,我們一起討論。


這裡主要討論一下winpcap開發中可能遇到的問題,如果能幫助您解決一些困難,將是我的榮幸。

winpcap開發包使用中的問題總結(之一):

最近使用winpcap發包又發現了點毛病,這裡貼出來。

1。關於winpcap的延遲引數設定多少。

       在winpcap的open_live中有一個延遲引數,主要是設定多長時間返回,當使用主執行緒抓包時應該設定長一點,500ms~1000ms左右,設定的過小winpcap 會抓不到包。如果是在子執行緒下可以設定的小一些。

2。如果有發包的情況怎麼設定。

    如果你的捕獲和發包在一個執行緒裡,就是捕獲後立即發包的話,你會發現即使設定成1ms還是有不小的延遲,我感覺主要還是winpcap發包機制不是太好,你可以設定成-1,也就是捕獲後立刻返回,這樣會快一些(平均反映速度提高10倍左右),雖然還是會有些的延遲,但是一般的專案要求基本可以滿足了。

3。出現不停傳送同一個包的情況怎麼辦。

      如果你在作TCP或DNS,ARP欺騙或其他需要捕獲後立刻傳送包的程式時可能會發現每捕獲一個包就會作很多回復,而且是一樣的,為什麼呢?一般是因為你的pcap_next_ex或類似的抓包函式沒有注意返回值,一定要注意寫成if(pcap_next_ex(....)==1)的形式,不要直接用pcap_next_ex因為其可能==0這個時候會把前一個包重複抓一遍。可以參考winpcap開發手冊。