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    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 );
时间: 2024-08-02 18:54:49

winPcap_4_获取已安装设备的高级信息的相关文章

WinPcap笔记2之获取已经安装设备的高级信息

1 主要数据结构定义 struct pcap_if//网络接口列表的一个节点 一个网络接口就是一个结点 方便链表    {        struct pcap_if *next;//网络接口节点        char *name;//网络接口名字        struct pcap_addr *address;//网络接口地址        bpf_u_int32 flags;//标记        char *description;//描述信息    } typedefstruct p

如何查看已安装的CentOS版本信息

如何查看已安装的CentOS版本信息: 1)[[email protected] ~]# cat /proc/version Linux version 2.6.18-194.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:58:14 EDT 2010 2) [[email protected] ~]# uname -a Linux localhost.loca

如何直接在 PC 端获取其它端设备的 UserAgent 信息呢?

取 UA,不求人 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5909615.html 序 希望收集一批移动端(手机.平板.Kindle 以及不同的产商,如苹果.三星.谷歌和诺基亚等)或者桌面端(谷歌.火狐.Oprea 和 IE 等)的 UA 信息. 这里主要通过 Chrome 自带的开发工具介绍用法,并且以 FireFox 作为补充说明. 目录 通过 Chrome 的 Emulation 选项 使用 FireFox 插件:User-Agen

Android手机做热点时,如何获取连过来设备的具体信息?

1.连接过来的设备的信息存放在/data/misc/dhcp/dnsmasq.leases中 2.它的格式是: /系统id,不需取值/client mac地址/client ip地址/ client device name/加权后mac地址,也不需取值 <span style="font-size:14px;">1357041758 88:00:12:34:56:78 192.168.43.133 android-184cc6c105d7a3b 01:88:00:12:34

获取已安装应用在/data/app目录下的apk安装包,并分享

我做这个小工具的原因是:有一次在课堂上,我室友在玩一款益智的小游戏,我看着也觉得挺有意思的:因为不想浪费流量,所以想让他把安装包发给我,可是他已经把安装包给删了:琢磨了半天,说可以用Root Explorer在/data/app目录下找的安装包,可是他的手机又没有ROOT.好吧,这个想法就这么来了,而且实现起来也很简单,两下功夫就做完了. 简单思路: 1.获取android设备的应用列表 2.找到应用在/data/app目录下对应的安装包文件 3.使用Intent启动相应应用分享安装包 运行效果

VB.Net遍历已安装的程序卸载信息

1 Private Shared Function ProgramExists(ByVal pgName As String) As Boolean 2 Dim temp As String = Nothing 3 Dim tempType As String = Nothing 4 Dim displayName As Object = Nothing 5 Dim uninstallString As Object = Nothing 6 Dim releaseType As Object =

android插件化-获取apkplug框架已安装插件-03

上一篇文章成功的将apkplug框架嵌入了应用中并且启动 链接http://www.apkplug.com/blog/?post=10 这一篇文章实现如何获取所有已安装插件 一 获取框架的SystemBundle的上下文BundleContext apkplug框架启动会自动创建一个SystemBundle, 它是框架的第一个插件不可停止和卸载,通过它我们可以与apkplug和其他插件通信 FrameworkInstance.getSystemBundle() 便可以获取到SystemBundl

关于获取Android系统所有已安装App信息的一些操作(详细)

转载请注明出处:http://blog.csdn.net/qinjuning       本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过.

关于Android的Build类——获取Android手机设备各种信息

经常遇到要获取Android手机设备的相关信息,来进行业务的开发,比如经常会遇到要获取CPU的类型来进行so库的动态的下载.而这些都是在Android的Build类里面.相关信息如下: private String loadSystemInfo() { StringBuilder sb = new StringBuilder(); sb.append("主板:" + Build.BOARD + "\n"); sb.append( "系统启动程序版本号:&q