【VS开发】使用WinPcap编程(1)——获取网络设备信息

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_FILE, PCAP_SRC_IFLOCAL, PCAP_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_NULL 和 RPCAP_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;
}

转载于:https://www.cnblogs.com/huty/p/8518338.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。 这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。 WinPcap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包 将原始数据包通过网络发送出去 收集并统计网络流量信息 以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。 所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。 如果您现在就想开始摸索这些功能,您可以直接进入 WinPcap用户手册. 哪些程序在使用WinPcap WinPcap可以被用来制作许多类型的网络工具,比如具有分析,解决纷争,安全和监视功能的工具。特别地,一些基于WinPcap的典型应用有: 网络与协议分析器 (network and protocol analyzers) 网络监视器 (network monitors) 网络流量记录器 (traffic loggers) 网络流量发生器 (traffic generators) 用户级网桥及路由 (user-level bridges and routers) 网络入侵检测系统 (network intrusion detection systems (NIDS)) 网络扫描器 (network scanners) 安全工具 (security tools) 什么是WinPcap做不到的 WinPcap能 独立地 通过主机协议发送和接受数据,如同TCP-IP。这就意味着WinPcap不能阻止、过滤或操纵同一机器上的其他应用程序的通讯:它仅仅能简单地"监视"在网络上传输的数据包。所以,它不能提供类似网络流量控制、服务质量调度和个人防火墙之类的支持

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值