winpcap(1)(PC机没有和装置同一网段的网卡)

本文深入探讨了pcap_if_t数据结构,它用于表示网络接口信息,以及pcap_findalldevs_ex函数,用于创建可用于pcap_open函数的网络适配器设备列表。文章详细介绍了这两个核心组件的功能、参数和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   pcap_if_t是一个interface数据结构,表明网络接口的信息。网络接口就是interface,就是我们用来上网的设备,一般为网卡,还有 一些虚拟网卡也算作这样的接口。函数pcap_findalldevs_ex或pcap_findalldevs分别返回一个 pcap_if_t类型的链表alldevs或alldevsp。每个pcap_if_t结构体都包含一个适配器的详细信息。其中成员 name 和 description 分别表示一个适配器的名称和一个更容易让人理解的描述。

struct pcap_if {
     struct pcap_if *next; /*如果不为NULL,则指向链表的下一个元素。如果为NULL,则为链表的尾部*/

     char *name;     /*给pcap_open_live函数传递的一个描述设备名称的字符串指针*/

     char *description;  /*如果不为NULL,则指向描述设备的一个可读字符串*/

     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;      /* IP地址 */

     struct sockaddr *netmask;   /* 网络掩码 */

     struct sockaddr *broadaddr; /* 广播地址 */

     struct sockaddr *dstaddr;   /* P2P目的地址*/
 };

 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可以使用上面设置好的source,也可以使用:PCAP_SRC_FILE_STRING 或者 PCAP_SRC_IF_STRING,分别是文件和接口的字符串。"file://", "rpcap://"。

参数auth是一个指向pcap_rmtauth结构体的指针。该指针保持着认证RPCAP连接到远程主机所需的信息。该参数对本地主机请求没什么意义,此时可以设为NULL。auth是远程登录信息,有用户名、密码、类型。用户名和密码都是字符指针,类型有:RPCAP_RMTAUTH_NULLRPCAP_RMTAUTH_PWD

参数alldevs是一个“pcap_if_t”结构体类型的指针,在该函数中被正确的分配。该函数成功返回时,该指针被设置为指向网络设备链表的 第一个元素,该链表的每个元素都是“pcap_if_t”类型。alldevs用于存储返回的接口信息。我们要事先定义pcap_if_t *alldevs,这是一个链表,存储接口信息。

参数errbuf是一个指向用户分配的缓冲区(大小为PCAP_ERRBUF_SIZE)的指针,如果函数操作出现错误,该缓冲区将存储该错误信息。

函数成功则返回0,如果有错误则返回-1。“alldevs”变量返回设备列表,当函数正确返回时,“alldevs”不能为NULL。也就是说,当系统没有任何接口时,该函数也返回-1。“errbuf”变量返回错误信息,一个错误可能由下列原因导致:

Ø         WinPcap没有安装在本地/远程主机上

Ø         用户没有足够的权限来列出这些设备/文件

Ø         一个网络故障

Ø         RPCAP版本协商失败(the RPCAP version negotiation failed)

Ø         其它错误(如没足够的内存或其它的问题)

值得注意的是,通过调用pcap_findalldevs函数可能存在网络设备不能被pcap_open函数打开的现象。比如可能没有足够的权限来打开它们并进行捕获,如果是这样,这些设备将不出现在设备列表中。

该函数所获取的设备列表必须采用pcap_freealldevs函数手工进行释放。

 

 pcap_freealldevs函数

由函数pcap_findalldevs_ex或pcap_findalldevs函数返回的网络适配器设备链表,必须调用pcap_freealldevs函数释放。该函数的原型如下:

void pcap_freealldevs(pcap_if_t *alldevsp )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值