2015-02-05 81 views
0

我正在使用pcap.h進行基本的數據包嗅探器。當我單元測試稱爲pcap_dispatch的函數時,我給了它非激活的接口和無效的接口。 pcap_dispatch返回-3,並且就pcap_dispatch的手冊頁而言,它應該只返回-2,-1或更多,但不會更少。是否可以檢查一個接口是否在pcap中被激活?

當然,我可以在pcap_dispatch返回後處理這個-3的返回值,將其作爲一些模糊的邊緣情況處理,但是我想確保它不會返回這樣的值。

只有當我知道如何檢查接口是否被激活時,我纔可以用assert做到這一點。那麼,有人知道嗎?


pcap_t *null_iface = NULL; 
pcap_t *not_act = pcap_create("valid", errmsg); 
pcap_t *act = pcap_create("valid", errmsg); 
    pcap_activate(act); 
pcap_t *not_act_inv = pcap_create("invalid", errmsg); 
pcap_t *act_inv = pcap_create("invalid", errmsg); 
    pcap_activate(act); 
pcap_t *ifaces[ 5 ] = { 
    null_iface, not_act, act, not_act_inv, act_inv 
    }; 

for (int a = 0; a < 5; a++) { 
    result = pcap_dispatch(iface[ a ], 1, handler, NULL); 
    // if one - got one 
    // elif zero - got nothing 
    // elif -1 - error (doesn't fire, by the way) 
    // elif -2 - I manually stopped it 
    // else  - impossible - but the assert fires 
    //   - printing result is -3 
    //   - for not_act, not_act_inv, and act_inv 
    else { 
     assert(false); 
    } 
} 

回答

1

是否可以檢查一個接口在PCAP激活?

是。您通過查看返回值pcap_activate()進行檢查。該pcap_activate()手冊頁說:

pcap_activate()成功返回0,而不警告,PCAP_WARNING_PROMISC_NOTSUP對不上成功支持混雜模式如果請求混雜模式,PCAP_WARNING與其他任何警告的設備上的成功,PCAP_ERROR_ACTIVATED如果句柄已被激活,PCAP_ERROR_NO_SUCH_DEVICE如果創建句柄時指定的捕獲源不存在,PCAP_ERROR_PERM_DENIED如果進程沒有權限打開捕獲源,PCAP_ERROR_RFMON_NOTSUP如果指定了監視器模式但捕獲源不支持監視模式,PCAP_ERROR_IFACE_NOT_UP如果捕獲源未啓動,並且PCAP_ERROR發生了另一個錯誤。如果返回PCAP_WARNINGPCAP_ERROR,則可以調用pcap_geterr()pcap_perror()並使用p作爲獲取或顯示描述警告或錯誤的消息的參數。如果返回PCAP_WARNING_PROMISC_NOTSUP,PCAP_ERROR_NO_SUCH_DEVICEPCAP_ERROR_PERM_DENIED,則可調用pcap_geterr()pcap_perror()作爲獲取或顯示消息的參數,其中提供了有關該問題的其他詳細信息,如果該問題出乎意料,可能對調試問題有用。

順便說一下,您還應該檢查pcap_create()是否返回NULL。

+0

錯過了,謝謝 – user2738698 2015-02-05 19:56:09

相關問題