首页 > 代码库 > winPcap_4_获取已安装设备的高级信息

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:\n" 30             "rpcap://              ==> lists interfaces in the local machine\n" 31             "rpcap://hostname:port ==> lists interfaces in a remote machine\n" 32             "                          (rpcapd daemon must be up and running\n" 33             "                           and it must accept ‘null‘ authentication)\n" 34             "file://foldername     ==> lists all pcap files in the give folder\n\n" 35             "Enter your choice: "); 36  37   fgets(source, PCAP_ERRBUF_SIZE, stdin); 38   source[PCAP_ERRBUF_SIZE] = \0; 39  40   /* 获得接口列表 */ 41   if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1) 42   { 43     fprintf(stderr,"Error in pcap_findalldevs: %s\n",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\n",d->name); 68  69   /* 设备描述(Description) */ 70   if (d->description) 71     printf("\tDescription: %s\n",d->description); 72  73   /* Loopback Address*/ 74   printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no"); 75  76   /* IP addresses */ 77   for(a=d->addresses;a;a=a->next) { 78     printf("\tAddress Family: #%d\n",a->addr->sa_family); 79    80     switch(a->addr->sa_family) 81     { 82       case AF_INET: 83         printf("\tAddress Family Name: AF_INET\n"); 84         if (a->addr) 85           printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr)); 86         if (a->netmask) 87           printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr)); 88         if (a->broadaddr) 89           printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr)); 90         if (a->dstaddr) 91           printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr)); 92         break; 93 /* 94       case AF_INET6: 95         printf("\tAddress Family Name: AF_INET6\n"); 96         if (a->addr) 97           printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str))); 98        break; 99 */100       default:101         printf("\tAddress Family Name: Unknown\n");102         break;103     }104   }105   printf("\n");106 }107 108 109 110 /* 将数字类型的IP地址转换成字符串类型的 */111 #define IPTOSBUFFERS    12112 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 WIN32131     sockaddrlen = sizeof(struct sockaddr_in6);132     #else133     sockaddrlen = sizeof(struct sockaddr_storage);134     #endif135 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 );

 

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