2015-02-05 80 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

相关问题