zoukankan      html  css  js  c++  java
  • winPcap_3_获取设备列表

    获取设备列表

    int pcap_findalldevs_ex  (
        char *  source,
        //The 'source' is a parameter that tells the function where the lookup has to be done and it uses the same syntax of the pcap_open().
        //This source will be examined looking for adapters (local or remote) (e.g. source can be 'rpcap://' for local adapters or 'rpcap://host:port' for adapters on a remote host) or pcap files (e.g. source can be 'file://c:/myfolder/').
        struct pcap_rmtauth *  auth,
        //auth,:  a pointer to a pcap_rmtauth structure. This pointer keeps the information required to authenticate the RPCAP connection to the remote host. This parameter is not meaningful in case of a query to the local host: in that case it can be NULL. 
        pcap_if_t **  alldevs,
        //alldevs,:  a 'struct pcap_if_t' pointer, which will be properly allocated inside this function. When the function returns, it is set to point to the first element of the interface list; each element of the list is of type 'struct pcap_if_t'. 
        char *  errbuf
        //errbuf,:  a pointer to a user-allocated buffer (of size PCAP_ERRBUF_SIZE) that will contain the error message (in case there is one). 
    )

      ·功能:获得已连接的网络适配器列表;(Create a list of network devices that can be opened with pcap_open(). )

      ·该函数返回一个 pcap_if 结构的链表, 每个这样的结构都包含了一个适配器的详细信息;

      ·pcap_if结构链表中:数据域 namedescription 表示一个适配器名称和一个可以让人们理解的描述;

      ·errbuf:一旦发生错误,这个参数将会被libpcap写入字符串类型的错误信息;

    Returns:
    '0' if everything is fine, '-1' if some errors occurred. The list of the devices is returned in the 'alldevs' variable. When the function returns correctly, 'alldevs' cannot be NULL. In other words, this function returns '-1' also in case the system does not have any interface to list.

    The error message is returned in the 'errbuf' variable. An error could be due to several reasons:

    • libpcap/WinPcap was not installed on the local/remote host
    • the user does not have enough privileges to list the devices / files
    • a network problem
    • the RPCAP version negotiation failed
    • other errors (not enough memory and others).
    Warning:
    There may be network devices that cannot be opened with pcap_open() by the process calling pcap_findalldevs(), because, for example, that process might not have sufficient privileges to open them for capturing; if so, those devices will not appear on the list.

    The interface list must be deallocated manually by using the pcap_freealldevs().  

    
    
    struct pcap_rmtauth{
      int    type
         //Type of the authentication required.
      char *    username
         //Zero-terminated string containing the username that has to be used on the remote machine for authentication.
      char *    password
         //Zero-terminated string containing the password that has to be used on the remote machine for authentication. 
    };
     
    pcap_rmtauth struct

    typedef struct pcap_if pcap_if_t;

    struct  pcap_if
    {
        pcap_if *    next
        //if not NULL, a pointer to the next element in the list; NULL for the last element of the list
        char *    name
        //a pointer to a string giving a name for the device to pass to pcap_open_live()
        char *    description
        //if not NULL, a pointer to a string giving a human-readable description of the device
        pcap_addr *    addresses
        //a pointer to the first element of a list of addresses for the interface
        u_int    flags
        //PCAP_IF_ interface flags. Currently the only possible flag is PCAP_IF_LOOPBACK, that is set if the interface is a loopback interface.
    };
    pcap_if struct

    typedef struct pcap_addr pcap_addr_t;

    struct  pcap_addr
    {
        pcap_addr *    next
        //if not NULL, a pointer to the next element in the list; NULL for the last element of the list
        sockaddr *    addr
        //a pointer to a struct sockaddr containing an address
        sockaddr *    netmask
        //if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.
        sockaddr *    broadaddr
        //if not NULL, a pointer to a struct sockaddr that contains the broadcast address corre­ sponding to the address pointed to by addr; may be null if the interface doesn't support broadcasts
        sockaddr *    dstaddr
        //if not NULL, a pointer to a struct sockaddr that contains the destination address corre­ sponding to the address pointed to by addr; may be null if the interface isn't a point- to-point interface
    };
    pcap_addr struct
    void pcap_freealldevs  ( pcap_if_t *  alldevsp   )   

      ·功能:Free an interface list returned by pcap_findalldevs().(pcap_freealldevs() is used to free a list allocated by pcap_findalldevs().)

     1 #include "pcap.h"
     2 
     3 main()
     4 {
     5     pcap_if_t *alldevs;
     6     pcap_if_t *d;
     7     int i=0;
     8     char errbuf[PCAP_ERRBUF_SIZE];
     9     
    10     /* 获取本地机器设备列表 */
    11     if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
    12     {
    13         fprintf(stderr,"Error in pcap_findalldevs_ex: %s
    ", errbuf);
    14         exit(1);
    15     }
    16     
    17     /* 打印列表 */
    18     for(d= alldevs; d != NULL; d= d->next)
    19     {
    20         printf("%d. %s", ++i, d->name);
    21         if (d->description)
    22             printf(" (%s)
    ", d->description);
    23         else
    24             printf(" (No description available)
    ");
    25     }
    26     
    27     if (i == 0)
    28     {
    29         printf("
    No interfaces found! Make sure WinPcap is installed.
    ");
    30         return;
    31     }
    32 
    33     /* 不再需要设备列表了,释放它 */
    34     pcap_freealldevs(alldevs);
    35 }
     获取设备列表.c 

      编译:在Windows平台上,您需要创建一个工程,并按照 使用WinPcap编程 里的步骤做。 然而,我们建议您使用WinPcap developer's pack ( 详情请访问WinPcap网站, http://www.winpcap.org ), 因为它提供了很多已经配置好的范例,包括本教程中的所有示例代码,以及在编译运行时需要的 包含文件(include)库(libraries)

      结果:

      前部分为name,后面部分为description;

  • 相关阅读:
    使用IDEA启动Tomcat时出现端口被占用的问题解决办法
    在Navicat中设置id主键为UUID自增
    关于IDEA构建的maven项目:WEB-INF下的jsp移动到webapp下出现404无法访问的问题
    Spring框架学习日志(2/4)
    Spring框架学习日志(1/4)
    jenkins+python+pytest+selenium 自动化执行脚本并发送报告
    Selenium 添加Cookie实现绕过登录流程
    CSS
    集合
    Javaweb初学
  • 原文地址:https://www.cnblogs.com/aze-003/p/3959710.html
Copyright © 2011-2022 走看看