代码之家  ›  专栏  ›  技术社区  ›  user2738698

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

  •  0
  • user2738698  · 技术社区  · 10 年前

    我正在使用pcap.h制作一个基本的数据包嗅探器。当我在单元测试调用pcap_dispatch的函数时,我给了它未激活的接口和无效的接口。pcap_dispatch返回-3,就pcap_ddispatch的手册页而言,它应该只返回-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 回复  |  直到 10 年前
        1
  •  1
  •   user862787 user862787    10 年前

    是否可以检查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_警告 PCAP_错误 返回, pcap_geterr() pcap_perror() 可以调用 p 作为获取或显示描述警告或错误的消息的参数。如果 PCAP_警告_杂项_不支持 , PCAP_错误_无此类设备 PCAP_ERROR_PERM_DENIED 返回, pcap_geterr() pcap_perror() 可以调用 p 作为获取或显示消息的参数,该消息提供了有关问题的其他详细信息,如果出现意外情况,则可能有助于调试问题。

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