现在已经知道了如何获取本地设备的基本信息。事实上,WinPcap提供了其它更高级的信息。在函数pcap_findalldevs_ex()返回的pcap_if结构体中,都有一个pcap_addr的结构体,这个结构体用来保存地址信息。定义如下:

pcap_addr* next;//指向下一个节点
sockaddr* addr;//一个地址列表
sockaddr* netmask;//一个掩码列表
sockaddr* broadaddr;//一个广播地址列表
sockaddr* dstaddr;//一个目的地址列表

其中,sockaddr结构用来存储与Windows套接字通讯的计算机上的一个IP地址。定义如下:

unsigned short sa_family;//地址族
char sa_data[14];//IP地址

sockaddr一共16字节,其中2字节存储地址族(如AF_INET),14个字节用来存储IP地址,用来作为bind、connect、recvfrom、sendto等函数的参数,指明地址信息一般不直接针对次数据结构操作。一个和sockaddr相似的结构是sockaddr_in结构体,可以相互转换,也是16字节,定义如下:

unsigned short sin_family;//协议族,在socket编程中只能是AF_INET
unsigned short int sin_port;//存储端口号,使用网络字节顺序
struct in_addr sin_addr;//存储IP地址,使用in_addr结构
unsigned char sin_zero[8];//为了让sockaddr和sockaddr_in大小相同而保留的空字节

in_addr结构用来存储IP地址。在Linux中定义如下:

typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};

在Windows中定义如下:

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;

在Windows中是一个共用体,有三种方式表示IP地址:

(1)S_un_b:用四个字节表示IP地址的四个数字;

(2)S_un_w:用两个字节表示IP地址;

(3)S_addr:用一个长整形表示IP地址,例如192.168.3.144记为0xc0a80390,其中 c0 为192 ,a8 为 168, 03 为 3 , 90 为 144;

下面的代码对pcap_findalldevs_ex()函数返回的alldevs逐个打印详细信息:

#include "pcap.h"#ifndef WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#else
#include <winsock.h>
#endif// 函数原型
void ifprint(pcap_if_t *d);
char *iptos(u_long in);
char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen);int main()
{pcap_if_t *alldevs;pcap_if_t *d;char errbuf[PCAP_ERRBUF_SIZE + 1];char source[PCAP_ERRBUF_SIZE + 1];printf("Enter the device you want to list:\n""rpcap://              ==> lists interfaces in the local machine\n""rpcap://hostname:port ==> lists interfaces in a remote machine\n""                          (rpcapd daemon must be up and running\n""                           and it must accept 'null' authentication)\n""file://foldername     ==> lists all pcap files in the give folder\n\n""Enter your choice: ");fgets(source, PCAP_ERRBUF_SIZE, stdin);source[PCAP_ERRBUF_SIZE] = '\0';/* 获得接口列表 */if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1){fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* 扫描列表并打印每一项 */for (d = alldevs;d;d = d->next){ifprint(d);}pcap_freealldevs(alldevs);return 1;
}/* 打印所有可用信息 */
void ifprint(pcap_if_t *d)
{pcap_addr_t *a;char ip6str[128];/* 设备名(Name) */printf("%s\n", d->name);/* 设备描述(Description) */if (d->description)printf("\tDescription: %s\n", d->description);/* Loopback Address*/printf("\tLoopback: %s\n", (d->flags & PCAP_IF_LOOPBACK) ? "yes" : "no");/* IP addresses */for (a = d->addresses;a;a = a->next) {printf("\tAddress Family: #%d\n", a->addr->sa_family);switch (a->addr->sa_family){case AF_INET:printf("\tAddress Family Name: AF_INET\n");if (a->addr)printf("\tAddress: %s\n", iptos(((struct sockaddr_in *)a->addr)->sin_addr.S_un.S_addr));if (a->netmask)printf("\tNetmask: %s\n", iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));if (a->broadaddr)printf("\tBroadcast Address: %s\n", iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));if (a->dstaddr)printf("\tDestination Address: %s\n", iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));break;case AF_INET6:printf("\tAddress Family Name: AF_INET6\n");if (a->addr)printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));break;default:printf("\tAddress Family Name: Unknown\n");break;}}printf("\n");
}/* 将数字类型的IP地址转换成字符串类型的 */
#define IPTOSBUFFERS    12
char *iptos(u_long in)
{static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];static short which;u_char *p;p = (u_char *)∈which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);return output[which];
}char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
{socklen_t sockaddrlen;#ifdef WIN32sockaddrlen = sizeof(struct sockaddr_in6);
#elsesockaddrlen = sizeof(struct sockaddr_storage);
#endifif (getnameinfo(sockaddr,sockaddrlen,address,addrlen,NULL,0,NI_NUMERICHOST) != 0) address = NULL;return address;
}

结果如下:

WinPcap笔记(3):获取已安装设备的详细信息相关推荐

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

    继续WinPcap编程的学习,上一节说到<获取本地适配器信息>,本节的实例程序功能跟上一节的程序功能类似,只是打印了适配器更详细的信息,来看一下源码(在windows下codeblocks ...

  2. Android监控外接USB设备和获取USB等设备的详细信息

    1.通过如下Action监控USB设备的插入或拔出 UsbManager.ACTION_USB_ACCESSORY_ATTACHED;UsbManager.ACTION_USB_ACCESSORY_D ...

  3. Android 通过appt.exe获取已安装apk的版本信息

    F:\Sdk\build-tools\25.0.3> //build-tools的位置 aapt dump badging c:\suliaoquan-3_7_0.apk //apk的位置

  4. android 获取已安装应用的安装包,Android获取设备已安装的应用

    项目中, 我们经常要用到显示系统已安装的应用, 可以通过两种方式获取已安装的应用, 一种是通过ApplicationInfo, 一种是通过ResolveInfo. 这里用的是ResolveInfo, ...

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

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

  6. 获取已安装或未安装的apk签名

    某些时候需要获取已安装的apk或者是未安装的apk的签名信息,以下代码片段将会很有用. 1.通过app的packageName获取已安装的apk的签名信息 public Signature getPa ...

  7. android 获取apk资源,【Android开发】获取已安装应用的安装文件(apk文件)

     不管是"ES文件浏览器"."QQ"等应用,它们都可以获取本机已安装的应用程序信息,还可以发送安装包(apk文件)给别人. 这两天查了一些资料,有所收获,整 ...

  8. ios获取已安装的应用列表

    ios获取已安装的应用列表 #ios -(NSMutableArray*) getInstallAppInfo{NSMutableArray *arrayAppInfo = [[NSMutableAr ...

  9. android 获取已安装列表权限,Android 如何完整的获取到用户已安装应用列表

    接到产品经理的预研需求,说希望获取用户已安装应用列表.这个问题应该不难,只要是要把相关的知识点整理和验证一下. 对于获取用户已安装应用列表,我个人是很熟悉的,因为我的华为手机上,手机管家天天会在通知栏 ...

最新文章

  1. 第一个Sprint冲刺第十天
  2. 可以用for循环直接删除ArrayList的特定元素吗?可能会出现什么问题?怎样解决?
  3. php pdo mysql 乱码,php pdo连接数据库 解决中文乱码问题(wordpress mysql 问号?? ??)...
  4. micropython中文社区-micropython支持中文啦!
  5. [HDU] 1312Red and Black -用广搜求能探寻到的点的数目
  6. Key ssd_300_vgg/block3_box/L2Normalization/gamma not found in checkpoint的解决方案
  7. Crackeme018
  8. pymysql 数据库操控
  9. GeoServer style(sld)中文乱码解决方法
  10. 黑客组织Anonymous(匿名者)
  11. 关于医疗影像的mhd和dcm格式图像的读取和坐标转换
  12. 基于加密机制的WebService访问与通信安全
  13. GameObject.Find()能否查找隐藏属性的游戏对象?
  14. bubble pop
  15. 2016版excel_Excel怎么转换成pdf?教你三招超简单方法
  16. css+nth-child+无效,CSS nth-child()和:eq()在我的代码中不起作用
  17. 腾讯QQ是用什么语言写的?
  18. Spring AOP原理及使用,面试必备
  19. ibm tivoli_IBM Tivoli Access Manager:WebSEAL Kerberos连接
  20. 【Linux系列】多路复用IO,从底层理解select

热门文章

  1. 计算凸多边形面积的算法
  2. 利用 dbghelp.dll 生成 dump 文件
  3. mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引
  4. java判断对象已死_Java的JVM判断对象已死的基本算法分析
  5. hprose for java 教程_hprose for java源码分析-4
  6. oracle+trace参数设置,Oracle autotrace参数详解
  7. C学习杂记(三)笔试题:字符串大小写字母切换
  8. 修改无效_修改劳动合同日期被认定无效,青岛一企业被判赔双倍工资
  9. 160 - 2 Afkayas.1
  10. 《MySQL——外部检测与内部统计 判断 主库是否出现问题》