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()函数来实现打印。

 

winPcap_4_获取已安装设备的高级信息
  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    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

 

  结果:

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

 

此处只能显示电脑的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_获取已安装设备的高级信息

上一篇:Spring MVC Unauthorized问题


下一篇:spring security源码分析