win1

通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器设备列表。同时在程序结束时确保释放获取的设备列表。 图6-1函数调用关系图 1.1 wpcap.dll导出的相应函数接口 wpcap.dll为了获得与释放已连接的网络适配器设备列表,提供了下列函数:文件/wpcap/libpcap/pcap/pcap.h中 struct pcap_if; struct pcap_addr; int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);void pcap_freealldevs(pcap_if_t *alldevsp ) ; 文件wpcap/libpcap/remote-ext.h中int pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf); 1.1.1 pcap_if结构体函数pcap_findalldevs_ex或pcap_findalldevs分别返回一个 pcap_if_t类型的链表alldevs或alldevsp。每个pcap_if_t结构体都包含一个适配器的详细信息。其中成员 name 和 description 分别表示一个适配器的名称和一个更容易让人理解的描述。该结构体的定义如下:typedef struct pcap_if pcap_if_t; struct pcap_if {/*如果不为NULL,则指向链表的下一个元素。如果为NULL,则为链表的尾部*/struct pcap_if *next; /*给pcap_open_live函数传递的一个描述设备名称的字符串指针*/char *name; /*如果不为NULL,则指向描述设备的一个可读字符串*/char *description; /*一个指向接口地址链表的第一个元素的指针*/struct pcap_addr *addresses; /**PCAP_IF_接口标志。当前仅有的可能标志为PCAP_IF_LOOPBACK,*如果接口是回环的则设置该标志*/bpf_u_int32 flags; };其中结构体pcap_addr的定义在下面描述。结构体pcap_addr表示接口地址的信息,定义如下:typedef struct pcap_addr pcap_addr_t; struct pcap_addr { struct pcap_addr *next; /*指向下一个元素的指针*/ struct sockaddr *addr; /* IP地址 */ struct sockaddr *netmask; /* 网络掩码 */ struct sockaddr *broadaddr; /* 广播地址 */ struct sockaddr *dstaddr; /* P2P目的地址*/};1.1.2 pcap_findalldevs_ex函数 通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器设备列表。WinPcap提供了pcap_findalldevs_ex函数来实现这个功能,该函数的的原型如下:int pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf);该函数创建一个能用pcap_open函数打开的网络适配器设备列表。该函数是老函数pcap_findalldevs的一个扩展,pcap_findalldevs()是一个过时的函数,其只允许列出在本机上的网络设备。反之pcap_findalldevs_ex也允许列出一个远程机器上的网络设备,此外还能列出一个给定文件夹中可用的pcap文件。因为pcap_findalldevs_ex()依赖于标准的pcap_findalldevs()来获得本地机器的地址,所以它是平台无关的。万一该函数必须列出远程机器上的设备,它对那台机器打开一个新的控制连接,重新获得那个网络接口并终止连接。然而,如果函数检测到远程计算机正处在“激活模式”下,连接不会终止并使用已存在的套结字。“source”是一个告诉函数在哪儿查找设备的参数,并且它使用与pcap_open函数同样的语法。与pcap_findalldevs函数不同,该设备的名称 (由alldevs->name 指定,其它的存在已连接的链表中)已经被考虑用在pcap_open函数中。相反,pcap_findalldevs函数的输出必须采用pcap_createsrcstr()格式处理后,才能把源参数传递给pcap_open函数使用。参数source是一个字符型的缓冲区,根据新的WinPcap语法保存着“源的位置”。检查该源以寻找适配器(本机的或远程的)(如源可以为本机的适配器“rpcap://”或远程的适配器“rpcap://host:port”)或pcap文件(如源可以为“file://c:/myfolder/”)。该字符串应该预先仔细考虑,为了阐明所需的源是否为本地/远程适配器或文件。这些源的含义都在新的语法规定(Source Specification Syntax )中定义。参数auth是一个指向pcap_rmtauth结构体的指针。该指针保持着认证RPCAP连接到远程主机所需的信息。该参数对本地主机请求没什么意义,此时可以设为NULL。参数alldevs是一个“pcap_if_t”结构体类型的指针,在该函数中被正确的分配。该函数成功返回时,该指针被设置为指向网络设备链表的第一个元素,该链表的每个元素都是“pcap_if_t”类型。参数errbuf是一个指向用户分配的缓冲区(大小为PCAP_ERRBUF_SIZE)的指针,如果函数操作出现错误,该缓冲区将存储该错误信息。函数成功则返回0,如果有错误则返回-1。“alldevs”变量返回设备列表,当函数正确返回时,“alldevs”不能为NULL。也就是说,当系统没有任何接口时,该函数也返回-1。“errbuf”变量返回错误信息,一个错误可能由下列原因导致:Ø WinPcap没有安装在本地/远程主机上Ø 用户没有足够的权限来列出这些设备/文件Ø 一个网络故障Ø RPCAP版本协商失败(the RPCAP version negotiation failed)Ø 其它错误(如没足够的内存或其它的问题)值得注意的是,通过调用pcap_findalldevs函数可能存在网络设备不能被pcap_open函数打开的现象。比如可能没有足够的权限来打开它们并进行捕获,如果是这样,这些设备将不出现在设备列表中。该函数所获取的设备列表必须采用pcap_freealldevs函数手工进行释放。1.1.3 pcap_findalldevs函数函数pcap_findalldevs是一个过时的函数,其只允许列出本机上出现的网络设备。函数原型如下:int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);函数获得已连接并能打开的所有网络设备列表,该列表能够被pcap_open_live函数打开。参数alldevsp指向列表的第一个元素,列表的每个元素都为pcap_if_t类型。如果没有已连接并能打开的网络设备,该链表可能为NULL。函数失败返回-1,errbuf存储合适的错误信息;成功返回0。值得注意的是,通过调用pcap_findalldevs函数可能存在网络设备不能被pcap_open_live函数打开的现象。比如可能没有足够的权限来打开它们并进行捕获,如果是这样,这些设备将不出现在设备列表中。1.1.4 pcap_freealldevs函数由函数pcap_findalldevs_ex或pcap_findalldevs函数返回的网络适配器设备链表,必须调用pcap_freealldevs函数释放。该函数的原型如下:void pcap_freealldevs(pcap_if_t *alldevsp ) st1/:*{behavior:url(#ieooui) } 1.2 获得与释放网络适配器列表的实例 下列代码能获取适配器列表,并在屏幕上显示出来,如果没有找到适配器,将打印错误信息。并在程序结束时释放设备列表。#include "remote-ext.h"#include "pcap.h" main(){ pcap_if_t *alldevs; pcap_if_t *d; int i=0; char errbuf[PCAP_ERRBUF_SIZE]; //获取本地机器设备列表if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL , &alldevs, errbuf) == -1){ //获取设备列表失败,程序返回 fprintf(stderr,"Error in pcap_findalldevs_ex: %s/n", errbuf); exit(1); } //打印设备列表 for(d= alldevs; d != NULL; d= d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)/n", d->description); else printf(" (No description available)/n"); } if (i == 0){ //没找到设备接口,确认WinPcap已安装,程序退出 printf("/nNo interfaces found! Make sure WinPcap is installed./n"); return; } //不再需要设备列表了,释放它pcap_freealldevs(alldevs);}首先, pcap_findalldevs_ex函数和其他libpcap函数一样,有一个 errbuf 参数。一旦发生错误,这个参数将会被libpcap写入字符串类型的错误信息。 第二要记住,不是所有的操作系统都支持libpcap提供的网络程序接口,因此,如果想编写一个可移植的应用程序,就必须考虑在什么情况下, description 是 null。在本程序中遇到这种情况时,会打印提示语句"No description available"。 最后要记住,当完成了设备列表的使用,要调用 pcap_freealldevs() 函数将其占用的内存资源释放。 在某台WinXP的电脑上,运行该程序得到的结果是: 1. /Device/NPF_{4E273621-5161-46C8-895A-48D0E52A0B83} (Realtek RTL8029(AS) Ethernet Adapter) 2. /Device/NPF_{5D24AE04-C486-4A96-83FB-8B5EC6C7F430} (3Com EtherLink PCI) 正如所看见的,Windows平台下网络适配器的名称相当不易读,可见,解释性的描述是很有帮助的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 1.0操作系统是微软第一次对个人电脑操作平台进行用户图形界面的尝试。Windows 1.0基于MS-DOS操作系统。Windows 1.0本质上宣告了DOS操作系统的终结。 <br> <br>Microsoft Windows 1.0于1985年11月发布,最初售价为100美元;当时被人所青睐的GUI电脑平台是GEM及DESQview/X,因此用户对Windows 1.0的评价并不高。 <br>  <br>界面管理器并不是真正的Windows 1.0,1983年微软宣布将开始设计Windows,Windows1.0 的设计工作花费了55个开发人员整整一年的时间,直到1985年11月20日才正式发布,它基于MS-DOS2.0,界面已经比界面管理器大有改观。<br>  <br>Windows 1.0中鼠标作用得到特别的重视,用户可以通过点击鼠标完成大部分的操作。Windows 1.0 自带了一些简单的应用程序,包括日历、记事本、计算器等等。总之,现在看那时的Windows 1.0,总会让人感到它像是一个PDA,甚至可能功能还赶不上现在的PDA,不过这在当时已经相当吸引人了。Windows 1.0的另外一个显著特点就是允许用户同时执行多个程序,并在各个程序之间进行切换,这对于DOS来说是不可想象的。<br>  <br>Windows 1.0 可以显示256种颜色,窗口可以任意缩放,当窗口最小化的时候桌面上会有专门的空间放置这些窗口(其实就是现在的任务栏)。<br>  <br>在Windows 1.x中另外一个重要的程序是控制面板(Control Panel),对驱动程序、虚拟内存有了明确的定义,不过功能非常有限。<br><br>Microsoft Windows 1.0系统组件:MS-DOS Executive, Calendar, Cardfile, Notepad, Terminal, Calculator, Clock, Reversi, Control Panel, PIF (Program Information File) Editor, Print Spooler, Clipboard, RAMDrive, Windows Write, Windows Paint. <br><br>Windows 1.0的启动画面像极了臭名昭著的蓝屏死机。 <br>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值