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

好久沒寫博客了,今天寫點吧。

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

隨便轉載,轉載請註明出處http://blog.csdn.net/leotangcw/

歡迎大家和我交流Email:[email protected]

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

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

    winpcap開發環境需要是windows操作系統,而且必須安裝winpcap驅動纔可以調試您的程序。

如果您的程序調試出現類式如下問題:can't find wpcap.dll.............等找不到動態鏈接庫的毛病,請先下載安裝winpcap    http://www.winpcap.org/install/bin/WinPcap_3_1.exe

如果編譯的時候出現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.

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章