• winPcap_4_获取已安装设备的高级信息


    由 pcap_findalldevs_ex() 返回的每一个 pcap_if 结构体,都包含一个 pcap_addr 结构体,这个结构体由如下元素组成:

    • 一个地址列表
    • 一个掩码列表 (each of which corresponds to an entry in the addresses list).
    • 一个广播地址列表 (each of which corresponds to an entry in the addresses list).
    • 一个目的地址列表 (each of which corresponds to an entry in the addresses list).

    另外,函数 pcap_findalldevs_ex() 还能 返回远程适配器信息  一个位于所给的本地文件夹的pcap文件列表

    下面的范例使用了ifprint()函数来打印出 pcap_if 结构体中所有的内容。程序对每一个由 pcap_findalldevs_ex() 函数返回的pcap_if,都调用ifprint()函数来实现打印。

      1 #include "pcap.h"
      2 #pragma comment(lib, "wpcap.lib")
      3 #pragma comment(lib, "Packet.lib")
      4 #pragma comment(lib, "wsock32.lib")
      5 
      6 
      7 
      8 #ifndef WIN32
      9     #include <sys/socket.h>
     10     #include <netinet/in.h>
     11 #else
     12     #include <winsock.h>
     13 #endif
     14 
     15 
     16 // 函数原型
     17 void ifprint(pcap_if_t *d);
     18 char *iptos(u_long in);
     19 char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen);
     20 
     21 
     22 int main()
     23 {
     24   pcap_if_t *alldevs;
     25   pcap_if_t *d;
     26   char errbuf[PCAP_ERRBUF_SIZE+1];
     27   char source[PCAP_ERRBUF_SIZE+1];
     28 
     29   printf("Enter the device you want to list:
    "
     30             "rpcap://              ==> lists interfaces in the local machine
    "
     31             "rpcap://hostname:port ==> lists interfaces in a remote machine
    "
     32             "                          (rpcapd daemon must be up and running
    "
     33             "                           and it must accept 'null' authentication)
    "
     34             "file://foldername     ==> lists all pcap files in the give folder
    
    "
     35             "Enter your choice: ");
     36 
     37   fgets(source, PCAP_ERRBUF_SIZE, stdin);
     38   source[PCAP_ERRBUF_SIZE] = '';
     39 
     40   /* 获得接口列表 */
     41   if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1)
     42   {
     43     fprintf(stderr,"Error in pcap_findalldevs: %s
    ",errbuf);
     44     exit(1);
     45   }
     46 
     47   /* 扫描列表并打印每一项 */
     48   for(d=alldevs;d;d=d->next)
     49   {
     50     ifprint(d);
     51   }
     52 
     53   pcap_freealldevs(alldevs);
     54 
     55   return 1;
     56 }
     57 
     58 
     59 
     60 /* 打印所有可用信息 */
     61 void ifprint(pcap_if_t *d)
     62 {
     63   pcap_addr_t *a;
     64   char ip6str[128];
     65 
     66   /* 设备名(Name) */
     67   printf("%s
    ",d->name);
     68 
     69   /* 设备描述(Description) */
     70   if (d->description)
     71     printf("	Description: %s
    ",d->description);
     72 
     73   /* Loopback Address*/
     74   printf("	Loopback: %s
    ",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
     75 
     76   /* IP addresses */
     77   for(a=d->addresses;a;a=a->next) {
     78     printf("	Address Family: #%d
    ",a->addr->sa_family);
     79   
     80     switch(a->addr->sa_family)
     81     {
     82       case AF_INET:
     83         printf("	Address Family Name: AF_INET
    ");
     84         if (a->addr)
     85           printf("	Address: %s
    ",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
     86         if (a->netmask)
     87           printf("	Netmask: %s
    ",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
     88         if (a->broadaddr)
     89           printf("	Broadcast Address: %s
    ",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
     90         if (a->dstaddr)
     91           printf("	Destination Address: %s
    ",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
     92         break;
     93 /*
     94       case AF_INET6:
     95         printf("	Address Family Name: AF_INET6
    ");
     96         if (a->addr)
     97           printf("	Address: %s
    ", ip6tos(a->addr, ip6str, sizeof(ip6str)));
     98        break;
     99 */
    100       default:
    101         printf("	Address Family Name: Unknown
    ");
    102         break;
    103     }
    104   }
    105   printf("
    ");
    106 }
    107 
    108 
    109 
    110 /* 将数字类型的IP地址转换成字符串类型的 */
    111 #define IPTOSBUFFERS    12
    112 char *iptos(u_long in)
    113 {
    114     static char output[IPTOSBUFFERS][3*4+3+1];
    115     static short which;
    116     u_char *p;
    117 
    118     p = (u_char *)&in;
    119     which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
    120     sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
    121     return output[which];
    122 }
    123 
    124 
    125 /*
    126 char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
    127 {
    128     socklen_t sockaddrlen;
    129 
    130     #ifdef WIN32
    131     sockaddrlen = sizeof(struct sockaddr_in6);
    132     #else
    133     sockaddrlen = sizeof(struct sockaddr_storage);
    134     #endif
    135 
    136 
    137     if(getnameinfo(sockaddr, 
    138         sockaddrlen, 
    139         address, 
    140         addrlen, 
    141         NULL, 
    142         0, 
    143         NI_NUMERICHOST) != 0) address = NULL;
    144 
    145     return address;
    146 }
    147 */
    获取已安装设备的高级信息.c

      结果:

    此处只能显示电脑的ipv4的网卡信息,不知道为什么不能有ipv6的代码时,不能编译通过,不知道是包不支持,还是系统不支持;

    int pcap_findalldevs_ex  ( char *  source,  
      struct pcap_rmtauth *  auth,  
      pcap_if_t **  alldevs,  
      char *  errbuf   
     ) 

      ·该函数请查看前一篇;

    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. 
    };

    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.
    };

    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
    };
    struct sockaddr {
        unsigned short sa_family;
        char           sa_data[14];
    };

       ·详细的请看前面的socket编程;

    struct sockaddr_in{
        short                 sin_family;
        unsigned short        sin_port;
        struct   in_addr      sin_addr;
        char                  sin_zero[8];
    };

    in_addr

    The in_addr structure represents a host by its Internet address.

    struct in_addr {
      union {
              struct { u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;
              struct { u_short s_w1,s_w2; }            S_un_w;
              u_long                                   S_addr;
      } S_un;
    };

    Members

    S_un_b
    Address of the host formatted as four u_chars.
    S_un_w
    Address of the host formatted as two u_shorts.
    S_addr
    Address of the host formatted as a u_long. 

    fgets, fgetws

    Get a string from a stream.

    char *fgets( char *string, int n, FILE *stream );
    
    wchar_t *fgetws( wchar_t *string, int n, FILE *stream );
  • 相关阅读:
    大话设计模式C++实现-第1章-简单工厂模式
    mac下的git的安装与简单的配置
    Execute failed: java.io.IOException: Cannot run program &quot;sdk-linux/build-tools/22.0.0/aapt&quot;: error=2
    UIScrollView 循环滚动,代码超简单
    字符编码的前世今生
    Android 4.4 KitKat 支持 u 盘功能
    Java Tread多线程(1)实现Runnable接口
    (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)
    每日算法之二十三:Reverse Nodes in k-Group
    Android4.0-4.4 加入实体按键振动支持的方法(java + smali版本号)
  • 原文地址:https://www.cnblogs.com/aze-003/p/3959836.html
Copyright © 2020-2023  润新知