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

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

  结果:

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

  1. int pcap_findalldevs_ex ( char * source,
  2. struct pcap_rmtauth * auth,
  3. pcap_if_t ** alldevs,
  4. char * errbuf
  5. )

  ·该函数请查看前一篇;

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

typedef struct pcap_if pcap_if_t;

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

typedef struct pcap_addr pcap_addr_t;

  1. struct pcap_addr
  2. {
  3. pcap_addr * next
  4. //if not NULL, a pointer to the next element in the list; NULL for the last element of the list
  5. sockaddr * addr
  6. //a pointer to a struct sockaddr containing an address
  7. sockaddr * netmask
  8. //if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.
  9. sockaddr * broadaddr
  10. //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
  11. sockaddr * dstaddr
  12. //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
  13. };
  1. struct sockaddr {
  2. unsigned short sa_family;
  3. char sa_data[];
  4. };

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

  1. struct sockaddr_in{
  2. short sin_family;
  3. unsigned short sin_port;
  4. struct in_addr sin_addr;
  5. char sin_zero[];
  6. };

in_addr

The in_addr structure represents a host by its Internet address.

  1. struct in_addr {
  2. union {
  3. struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
  4. struct { u_short s_w1,s_w2; } S_un_w;
  5. u_long S_addr;
  6. } S_un;
  7. };

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.

  1. char *fgets( char *string, int n, FILE *stream );
  2.  
  3. wchar_t *fgetws( wchar_t *string, int n, FILE *stream );

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

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

    1 主要数据结构定义 struct pcap_if//网络接口列表的一个节点 一个网络接口就是一个结点 方便链表    {        struct pcap_if *next;//网络接口节点   ...

  2. Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用

    一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发.首先必须要考虑的就是集成第三方SDK,支付这块渠道商已经帮你我们做好了,只需要按照文档对 ...

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

    如何直接在 PC 端获取其它端设备的 UserAgent 信息呢 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5909615.html 序 希望收 ...

  4. 查看已安装的CentOS版本信息:

    如何查看已安装的CentOS版本信息: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@ ...

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

    如何查看已安装的CentOS版本信息: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@ ...

  6. c#获取已安装的所有NET版本

    /// <summary> /// 获取已安装的所有NET版本 /// </summary> /// <returns></returns> publi ...

  7. iOS获取已安装的app列表(私有库)+ 通过包名打开应用

    1.获取已安装的app列表 - (void)touss { Class lsawsc = objc_getClass("LSApplicationWorkspace"); NSOb ...

  8. 获取已安装app的bundle id

    备注:以下是私有api 苹果审核会被拒绝. 导入头文件 #import <objc/runtime.h> /// 获取其他APP信息(iOS11无效) + (NSArray *)getOt ...

  9. iOS 获取已安装 的APP

    -(void)getAppPlist { Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace ...

随机推荐

  1. 獲取 Textarea 的光標位置(摘自網絡)

    在任何编辑器中,获取光标位置都是非常重要的,很多人可能认为较难,其实只要处理好浏览器的兼容,还是比较容易实现的.下面我们一起来看看如何获取到 Textarea 元素中的光标位置.首先,我们用 rang ...

  2. Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager

    第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...

  3. Android(java)学习笔记225:Activity 4 种启动模式

    1. 任务栈(task stack): 任务栈 是用来记录用户操作的行为,维护一个用户体验. 一个应用程序一般都是由多个activity组成的. 任务栈(task stack)记录存放用户开启的act ...

  4. Python 代码实现模糊查询

    Python 代码实现模糊查询 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列 ...

  5. android应用的不同版本间兼容性处理

    在Android系统中向下兼容性比较差,但是一个应用APP经过处理还是可以在各个版本间运行的.向下兼容性不好,不同版本的系统其API版本也不同,自然有些接口也不同,新的平台不能使用旧的API,旧的平台 ...

  6. springmvc学习笔记(理论)

    1.springmvc是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层 进行职责解耦,基 ...

  7. 用CSS创建小三角形问题(笔试题常考)

    笔试题中经常遇到用CSS实现某个Div边框添加三角形问题,掌握一点,合理利用div的边框,当div有宽有高时,边框就是不起眼的边框,当div的宽高为0时,边框就是一个小方块,把剩下的三个边透明就是神奇 ...

  8. 控制器View的加载过程

    1.控制器内部的view是延迟加载 1> 用到时再加载2> 加载完毕后会调用控制器的viewDidLoad方法 2.创建控制器的方式 1> 直接通过代码创建OneViewContro ...

  9. OC语法简写

    NSNumber [NSNumber numberWithInt:666] 等价于 @666 [NSNumber numberWithLongLong:666ll] 等价于 @666ll [NSNum ...

  10. cas配置全攻略(转)

    转:http://www.blogjava.net/tufanshu/archive/2011/01/21/343290.html 经过将近两天的测试,参考众多网友的贡献,终于完成了对cas的主要配置 ...