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()函数来实现打印。
- #include "pcap.h"
- #pragma comment(lib, "wpcap.lib")
- #pragma comment(lib, "Packet.lib")
- #pragma comment(lib, "wsock32.lib")
- #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+];
- char source[PCAP_ERRBUF_SIZE+];
- 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) == -)
- {
- fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
- exit();
- }
- /* 扫描列表并打印每一项 */
- for(d=alldevs;d;d=d->next)
- {
- ifprint(d);
- }
- pcap_freealldevs(alldevs);
- return ;
- }
- /* 打印所有可用信息 */
- void ifprint(pcap_if_t *d)
- {
- pcap_addr_t *a;
- char ip6str[];
- /* 设备名(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_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][*++];
- static short which;
- u_char *p;
- p = (u_char *)∈
- which = (which + == IPTOSBUFFERS ? : which + );
- sprintf(output[which], "%d.%d.%d.%d", p[], p[], p[], p[]);
- return output[which];
- }
- /*
- char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
- {
- socklen_t sockaddrlen;
- #ifdef WIN32
- sockaddrlen = sizeof(struct sockaddr_in6);
- #else
- sockaddrlen = sizeof(struct sockaddr_storage);
- #endif
- if(getnameinfo(sockaddr,
- sockaddrlen,
- address,
- addrlen,
- NULL,
- 0,
- NI_NUMERICHOST) != 0) address = NULL;
- return address;
- }
- */
获取已安装设备的高级信息.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[];
- };
·详细的请看前面的socket编程;
- struct sockaddr_in{
- short sin_family;
- unsigned short sin_port;
- struct in_addr sin_addr;
- char sin_zero[];
- };
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_获取已安装设备的高级信息的更多相关文章
- WinPcap笔记2之获取已经安装设备的高级信息
1 主要数据结构定义 struct pcap_if//网络接口列表的一个节点 一个网络接口就是一个结点 方便链表 { struct pcap_if *next;//网络接口节点 ...
- Unity获取安卓手机运营商,电量,wifi信号强度,本地Toast,获取已安装apk,调用第三方应用,强制自动重启本应用
一个完整的游戏项目上线需要不断的完善优化,但是到了后期的开发不再仅仅是游戏了,它的复杂度远远大于纯粹的应用开发.首先必须要考虑的就是集成第三方SDK,支付这块渠道商已经帮你我们做好了,只需要按照文档对 ...
- 如何直接在 PC 端获取其它端设备的 UserAgent 信息呢?
如何直接在 PC 端获取其它端设备的 UserAgent 信息呢 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5909615.html 序 希望收 ...
- 查看已安装的CentOS版本信息:
如何查看已安装的CentOS版本信息: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@ ...
- 如何查看已安装的CentOS版本信息
如何查看已安装的CentOS版本信息: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@ ...
- c#获取已安装的所有NET版本
/// <summary> /// 获取已安装的所有NET版本 /// </summary> /// <returns></returns> publi ...
- iOS获取已安装的app列表(私有库)+ 通过包名打开应用
1.获取已安装的app列表 - (void)touss { Class lsawsc = objc_getClass("LSApplicationWorkspace"); NSOb ...
- 获取已安装app的bundle id
备注:以下是私有api 苹果审核会被拒绝. 导入头文件 #import <objc/runtime.h> /// 获取其他APP信息(iOS11无效) + (NSArray *)getOt ...
- iOS 获取已安装 的APP
-(void)getAppPlist { Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace ...
随机推荐
- 獲取 Textarea 的光標位置(摘自網絡)
在任何编辑器中,获取光标位置都是非常重要的,很多人可能认为较难,其实只要处理好浏览器的兼容,还是比较容易实现的.下面我们一起来看看如何获取到 Textarea 元素中的光标位置.首先,我们用 rang ...
- Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...
- Android(java)学习笔记225:Activity 4 种启动模式
1. 任务栈(task stack): 任务栈 是用来记录用户操作的行为,维护一个用户体验. 一个应用程序一般都是由多个activity组成的. 任务栈(task stack)记录存放用户开启的act ...
- Python 代码实现模糊查询
Python 代码实现模糊查询 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列 ...
- android应用的不同版本间兼容性处理
在Android系统中向下兼容性比较差,但是一个应用APP经过处理还是可以在各个版本间运行的.向下兼容性不好,不同版本的系统其API版本也不同,自然有些接口也不同,新的平台不能使用旧的API,旧的平台 ...
- springmvc学习笔记(理论)
1.springmvc是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层 进行职责解耦,基 ...
- 用CSS创建小三角形问题(笔试题常考)
笔试题中经常遇到用CSS实现某个Div边框添加三角形问题,掌握一点,合理利用div的边框,当div有宽有高时,边框就是不起眼的边框,当div的宽高为0时,边框就是一个小方块,把剩下的三个边透明就是神奇 ...
- 控制器View的加载过程
1.控制器内部的view是延迟加载 1> 用到时再加载2> 加载完毕后会调用控制器的viewDidLoad方法 2.创建控制器的方式 1> 直接通过代码创建OneViewContro ...
- OC语法简写
NSNumber [NSNumber numberWithInt:666] 等价于 @666 [NSNumber numberWithLongLong:666ll] 等价于 @666ll [NSNum ...
- cas配置全攻略(转)
转:http://www.blogjava.net/tufanshu/archive/2011/01/21/343290.html 经过将近两天的测试,参考众多网友的贡献,终于完成了对cas的主要配置 ...