显示适配器详细信息

先贴上代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "pcap.h"
  5. #include <winsock2.h>
  6.  
  7. typedef struct sockaddr_in sockad;
  8.  
  9. /* 从tcptraceroute数字IP地址转换为字符串 */
  10. #define IPTOSBUFFERS 12
  11. char *iptos(u_long in)
  12. {
  13. static char output[IPTOSBUFFERS][*++];
  14. static short which;
  15. u_char *p;
  16.  
  17. p = (u_char *)&in;
  18. which = (which + == IPTOSBUFFERS ? : which + );
  19. sprintf(output[which], "%d.%d.%d.%d", p[], p[], p[], p[]);
  20. return output[which];
  21. }
  22.  
  23. /* 给定的接口上打印所有可用的信息 */
  24. void ifprint(pcap_if_t *d)
  25. {
  26. pcap_addr_t *a;
  27.  
  28. /* 名字 */
  29. printf("%s\n",d->name);
  30.  
  31. /* 描述 */
  32. if (d->description)
  33. printf("\t描述: %s\n",d->description);
  34.  
  35. /* 环回地址*/
  36. printf("\t环回: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
  37.  
  38. /* IP addresses */
  39. for(a=d->addresses;a;a=a->next) {
  40. printf("\tAddress Family: #%d\n",a->addr->sa_family);
  41.  
  42. switch(a->addr->sa_family)
  43. {
  44. case AF_INET:
  45. printf("\tAddress Family Name: AF_INET\n");
  46. if (a->addr)
  47. printf("\tIP地址: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
  48. if (a->netmask)
  49. printf("\t子网掩码: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
  50. if (a->broadaddr)
  51. printf("\t广播地址: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
  52. if (a->dstaddr)
  53. printf("\t目标地址: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
  54. break;
  55. default:
  56. printf("\tAddress Family Name: Unknown\n");
  57. break;
  58. }
  59. }
  60. printf("\n");
  61. }
  62.  
  63. int main()
  64. {
  65. pcap_if_t *alldevs;
  66. pcap_if_t *d;
  67. char errbuf[PCAP_ERRBUF_SIZE+];
  68.  
  69. /* 获取设备列表 */
  70. if (pcap_findalldevs(&alldevs, errbuf) == -)
  71. {
  72. fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
  73. exit();
  74. }
  75. for(d=alldevs;d;d=d->next)
  76. {
  77. ifprint(d);
  78. }
  79. return ;
  80. }

主要思路就是将得到的 pcap_if_t 展开来看,先看一下pcap_if_t 的结构:

有五个属性,名字、描述、pcap_addr类型的地址、flags、与指向下一个元素的指针。主要看看addresses:

pacp_addr 同样有五个属性,ip地址、子网掩码、广播地址、目标地址。

sockaddr定义如下:

struct sockaddr {
  unsigned short sa_family; /* address family, AF_xxx */
  char sa_data[14]; /* 14 bytes of protocol address */
  };

一般sockaddr与sockaddr_in是可以互相转换的:

struct sockaddr_in {
  short int sin_family; 
  unsigned short int sin_port; 
  struct in_addr sin_addr; 
  unsigned char sin_zero[8]; 
  };
  sin_family:指代协议族,可取值如下

        AF_INET            2             IPv4 
        AF_INET6          23           IPv6 
        AF_UNSPEC         0             协议无关
  sin_port:存储端口号(使用网络字节顺序)
  sin_addr:存储IP地址,使用in_addr这个数据结构
  sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

而其中IP地址的定义:

typedef struct in_addr {
  union {
  struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;
  struct{ unsigned short s_w1, s_w2;} S_un_w;
  unsigned long S_addr;
  } S_un;
  } IN_ADDR;
阐述下in_addr的含义,很显然它是一个存储ip地址的共用体有三种表达方式:
第一种用四个字节来表示IP地址的四个数字;
第二种用两个双字节来表示IP地址;
第三种用一个长整型来表示IP地址。

这里先吧sockaddr强制转换成aockaddr_in,然后取其中的sin_addr中的s_addr表示方式,然后将这个 unsigned long转换成可读的ip地址。

u_char是无符号字符类型,最大值是255。

输出结果:

winPcap编程之获取适配器详细信息(三)的更多相关文章

  1. winPcap编程之获取适配器信息(二)

    首先要读一下这一页的东西:http://www.winpcap.org/docs/docs_412/html/group__wpcapsamps.html 可以结合中文版本看http://www.fe ...

  2. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  3. 钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息

    最近有个需求,在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去企业内部的用户中心做校验,校验通过,相关子系统直接登陆; 就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所 ...

  4. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  5. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...

  6. winPcap编程之打开适配器并捕获数据包(四 转)

    在贴源码之前先介绍一个将要用到的很重要的函数--pcap_open(),下面是pcap_open()在remote-ex.h中的声明: pcap_t *pcap_open(const char *so ...

  7. 【Android Developers Training】 99. 获取联系人详细信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. ionic基于GPS定位并通过百度地图获取定位详细信息

    相信所有的前端攻城狮都会碰到移动端App.里面获取用户定位信息. 那么问题来了,怎么获取用户的定位信息(经纬度)呢. 当然方法有很多,通过百度地图API 以及 高德地图 API都是可以的.但是两个获取 ...

  9. 获取文件属性“详细信息” - StringFileInfo

    0.什么是StringFileInfo1.获取方法2.示例代码 参考链接: 1.MS docs - GetFileVersionInfoA:https://docs.microsoft.com/zh- ...

随机推荐

  1. 四则运算GUI

    一.题目描述 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成 ...

  2. 201521123107 《Java程序设计》第12周学习总结

    第12周-流与文件 1.本周学习总结 2.书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文 ...

  3. 201521123107 《Java程序设计》第11周学习总结

    第11周作业-多线程 1.本周学习总结 2.书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法 ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)2017.4.22

    昨天来不及编写,这是4月22日的日志,现在补上. 1.开完站立式会议后的合照 2.任务分解图 3.开会讨论的结果,任务分派 队员 今日进展 明日安排 陈鑫龙 原型设计图分析,设计登陆界面原稿 实现登陆 ...

  5. 201521123121 《JAVA程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声 ...

  6. 201521123085 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 代码: ...

  7. 201521123092《Java程序设计》第七周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下 publ ...

  8. 201521123004 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口号 协议:网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则 ...

  9. 201521123038 《Java程序设计》 第十四周学习总结

    201521123038 <Java程序设计> 第十四周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 接口: DriverManager ...

  10. 201521123048 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? ...