是否可以检查pcap中是否激活了接口?

时间:2015-02-05 14:30:36

标签: c++ assert pcap libpcap

我正在使用pcap.h制作一个基本的数据包嗅探器。当我单元测试调用pcap_dispatch的函数时,我给它了非激活接口和无效接口。 pcap_dispatch返回-3,并且就pcap_dispatch的手册页而言,它应该只返回-2,-1或更多,但绝不会更少。

当然,我可以在pcap_dispatch返回后处理这个-3返回值,将其作为一些模糊的边缘情况处理,但我想确保它不会返回这样的值。

只有当我知道如何检查界面是否被激活时,我才能使用断言。那么,有人知道吗?


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 个答案:

答案 0 :(得分: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如果进程没有打开捕获的权限source,PCAP_ERROR_RFMON_NOTSUP如果指定了监控模式但捕获源不支持监控模式,PCAP_ERROR_IFACE_NOT_UP如果捕获源未启动,PCAP_ERROR如果发生其他错误。如果返回PCAP_WARNINGPCAP_ERROR,则可以使用 p 作为参数调用pcap_geterr()pcap_perror()来获取或显示描述警告的消息或错误。如果返回PCAP_WARNING_PROMISC_NOTSUPPCAP_ERROR_NO_SUCH_DEVICEPCAP_ERROR_PERM_DENIED,则可以使用 p 作为fetch的参数调用pcap_geterr()pcap_perror()或者显示一条消息,提供有关问题的其他详细信息,如果出现意外情况,可能对调试问题有用。

顺便说一句,您还应该检查pcap_create()是否返回NULL。