使用WinPcap编程(1)——获取网络设备信息

摘要:
pcap_if_t是一个interface数据结构,表明网络接口的信息。然后使用函数pcap_findalldevs_ex()这个函数来获取网络设备,其原型如下:intpcap_findalldevs_ex1、source可以使用上面设置好的source,也可以使用:PCAP_SRC_FILE_STRING或者PCAP_SRC_IF_STRING,分别是文件和接口的字符串。我们要事先定义pcap_if_t*alldevs,这是一个链表,存储接口信息。最后不用这些设备的时候要把他们释放掉,使用函数pcap_freealldevs(),其原型如下:voidpcap_freealldevs附上一个源代码:#include"pcap.h"intmain(){pcap_if_t*alldevs;//pcap_if_tisinterfacetypepcap_if_t*d;charerrbuf[PCAP_ERRBUF_SIZE];//storeerrorinformationinti;//structpcap_rmtauthUbuntu_cat;charsource[PCAP_BUF_SIZE];if{printf;exit(-1);}printf;if{printf;exit;}d=alldevs;while(d!

image

pcap_if_t是一个interface数据结构,表明网络接口的信息。网络接口就是interface,就是我们用来上网的设备,一般为网卡,还有一些虚拟网卡也算作这样的接口。它的结构如下:

struct pcap_if {
     struct pcap_if *next; 
     char *name;     
     char *description;  
     struct pcap_addr *addresses; 
     u_int flags;        
};

typedef struct pcap_if pcap_if_t; 

其中的struct pcap_addr为:

 struct pcap_addr {
     struct pcap_addr *next; 
     struct sockaddr *addr;      
     struct sockaddr *netmask;   
     struct sockaddr *broadaddr; 
     struct sockaddr *dstaddr;   
 };

当我们要获网络接口的时候,这个数据结构是非常重要的。

这里只说Local host的设备的获取,对于远程设备,虽然有方法可以获取,不过我试了试,总是出错。

首先使用pcap_createsrcstr()函数来初始化一个source,指明我们在哪里查找设备,可以是本地机器,可以是远程机器,可以是本地文件夹(这样找的就是存储好的tcpdump的数据文件)。其函数原型如下:

int 	pcap_createsrcstr (char *source, int type, const char *host, const char *port, const char *name, char *errbuf)

1、source就是我们要存储的位置信息。

2、type有本地文件、本地机器、远程机器可供选择,分别为:PCAP_SRC_FILEPCAP_SRC_IFLOCALPCAP_SRC_IFREMOTE

3、host是远程机器的名字,可以是"1.2.3.4”这样,也可以是"a.com”这样。本地为NULL。

4、port为远程端口。本地为NULL。

5、name为接口的名字。比如eth0。一般为NULL。如果是本地文件就是本地文件夹地址。

6、errbuf存储错误信息。

然后使用函数pcap_findalldevs_ex()这个函数来获取网络设备,其原型如下:

int pcap_findalldevs_ex	(char * source,
                         struct pcap_rmtauth * 	auth,
                         pcap_if_t ** 	alldevs,
                         char * 	errbuf	 
                         )	

1、source可以使用上面设置好的source,也可以使用:PCAP_SRC_FILE_STRING 或者 PCAP_SRC_IF_STRING,分别是文件和接口的字符串。"file://", "rpcap://"。

2、auth是远程登录信息,有用户名、密码、类型。用户名和密码都是字符指针,类型有:RPCAP_RMTAUTH_NULLRPCAP_RMTAUTH_PWD。参看这里

3、alldevs用于存储返回的接口信息。我们要事先定义pcap_if_t *alldevs,这是一个链表,存储接口信息。

4、errbuf出错信息。

这样所获得的alldevs就是一个接口的链表,如果是文件就是一个文件的链表。我们就可以用指针对这些链表进行操作了。

最后不用这些设备的时候要把他们释放掉,使用函数pcap_freealldevs(),其原型如下:

void 	pcap_freealldevs (pcap_if_t *alldevsp)

附上一个源代码:

#include "pcap.h"

int main()
{
	pcap_if_t *alldevs;	// pcap_if_t is interface type
	pcap_if_t *d;
	char errbuf[PCAP_ERRBUF_SIZE];	// store error information
	int i;
	// struct pcap_rmtauth Ubuntu_cat;
	char source[PCAP_BUF_SIZE];

	if (pcap_createsrcstr(source, PCAP_SRC_FILE,
		NULL, NULL,
		"E:\\My Documents\\MyProgram\\WinPcapPro\\Read one packet\\Read one packet",
		errbuf) == -1) {
		printf("Error in create source string: %s\n", errbuf);
		exit(-1);
	}

	printf("%s\n", source);

	if(pcap_findalldevs_ex(source,	// can be PCAP_SRC_IF_STRING for local host
						   NULL,	// auth to remote host. NULL if local host
						   &alldevs,
						   errbuf) == -1) {
		printf("Error in find all devices: %s\n", errbuf);
		exit(1);
	}

	d = alldevs;
	while(d != NULL) {
		printf("%s\n%s\nAddress: ", d->name, d->description);
		for (i = 0; d->addresses != NULL && i < 14; i++)
			printf("%d ", d->addresses->addr->sa_data[i]);
		printf("\n\n");
		d = d->next;
	}

	pcap_freealldevs(alldevs);

	return 0;
}

免责声明:文章转载自《使用WinPcap编程(1)——获取网络设备信息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇初学者:ACE学习用unity3d+cardboard开发一个全景图片查看器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】SHarpPcap(winpcap基于c#封转的库)网络嗅探程序核心

1. 获得网络设备 由于一个系统的网络设备可能不止一个,因而使用了一个列表类来保存所有的设备,这里使用了一个静态方法进行操作 /* Retrieve the device list */ PcapDeviceList devices = SharpPcap.GetAllDevices(); 获取列表后,就能对设备进行操作了,其实设备分为2个子类,一类是N...

在Visual Studio 2005中使用WinPcap编写程序的配置方法

下面简介一下如何在Visual Studio 2005中使用WinPcap编写程序。这里只是编写程序之前对Visual Studio 2005的配置,具体如何编写程序,请参看具体WinPcap的文档:http://www.winpcap.org/docs/docs_412/html/main.html。 本教程是参考http://www.winpcap.o...

linux sdio wifi驱动知识总结(一)

这两周在tq imx6ul下调一个迈威88w8801sdio wifi模组,最后尴尬的发现tq imx6ul并不支持sdio wifi。至于不支持的原因会在后面简单说一下,小弟才疏学浅如果有大佬在tqimx6ul上成功移植过sdio wifi,也请多多指教,好了现在进入正题吧。     首先我们要搞清楚SDIO WIFI是什么,SDIO WIFI首先是一个...

网络安全开发包介绍

网络安全开发包介绍 引言:网络安全领域的许多网络安全技术,如防火墙、入侵检测、安全扫描、网络嗅探、协议分析、流量统计、网络管理、蜜罐等,其设计和实现都离不开一些网络安全操作,其中一些基本操作都在底层进行,使用频繁,如网络地址的操作、网络接口的操作、数据包的捕获、数据包的构造和发送、网络入侵检测等;还有一些比较复杂的操作,如流量的统计、路由的管理,ARP缓存...

zabbix3.x添加H3C网络设备详解

                         zabbix3.x添加H3C网络设备详解                                             作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 前言:   欢迎加入:高级运维工程师之路 598432640   相信大家在看我的文章之前,也看过其他人写的博客...

Winpcap网络编程九之Winpcap实战,ARP协议获得MAC表及主机通信

大家好,本次我们须要完毕的任务是:  完毕两台主机之间的数据通信(数据链路层) 仿真ARP协议获得网段内主机的MAC表 使用帧完毕两台主机的通信(Hello! I’m …)         声明:本文章的目的是为大家的Winpcap编程带来一定的借鉴,希望对大家的课程设计有一定的帮助。总之,我相信,大家看了前几篇 Winpcap 编程基础知识,再加...