我正在使用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 );
}
}
答案 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_WARNING
或PCAP_ERROR
,则可以使用 p 作为参数调用pcap_geterr()
或pcap_perror()
来获取或显示描述警告的消息或错误。如果返回PCAP_WARNING_PROMISC_NOTSUP
,PCAP_ERROR_NO_SUCH_DEVICE
或PCAP_ERROR_PERM_DENIED
,则可以使用 p 作为fetch的参数调用pcap_geterr()
或pcap_perror()
或者显示一条消息,提供有关问题的其他详细信息,如果出现意外情况,可能对调试问题有用。
顺便说一句,您还应该检查pcap_create()
是否返回NULL。