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

Is it possible to check if an interface is activated in pcap?

本文关键字:是否 pcap 激活 接口 检查      更新时间:2023-10-16

我正在使用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 );
    }
}

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

是的。 您可以通过查看 pcap_activate() 的返回值来检查。 pcap_activate()手册页说:

pcap_activate() 在没有警告的情况下成功时返回 0,在不支持混杂模式的设备上返回 PCAP_WARNING_PROMISC_NOTSUP 成功时返回 0(如果请求混杂模式(,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,则可以使用 p 调用 pcap_geterr()pcap_perror() 作为参数,以获取或显示描述警告或错误的消息。 如果返回 PCAP_WARNING_PROMISC_NOTSUPPCAP_ERROR_NO_SUCH_DEVICEPCAP_ERROR_PERM_DENIED,则可以使用 p 调用 pcap_geterr()pcap_perror() 作为参数,以获取或显示一条消息,提供有关问题的其他详细信息,如果问题意外,这些详细信息可能有助于调试问题。

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