该函数的功能在于查找所有的网络设备,原型如下:
int pcap_findalldevs_ex(char* source, struct pcap_rmtauth *auth, pcap_if_t** alldevs, char* errbuf );
返回值:0表示查找成功,-1表示查找失败
使用案例:
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
参数介绍:
1.source
指定的是本地设配器或者远程适配器:
本地适配器:'rpcap://' 列出所有可用的本地设备
远程适配器:'rpcap://host:port' 列出远程host中的所有可用设备
抓包文件。'file://c:/myfolder/'. 列出文件夹中的所有文件
其定义如下:
#define PCAP_SRC_FILE_STRING "file://"
#define PCAP_SRC_IF_STRING "rpcap://"
2.auth
结构体定义如下:
struct pcap_rmtauth
{
int type;
char *username;
char *password;
};
type:简要身份验证所需的类型。
username:用户名
password:密码
auth参数可以为NULL.
3.alldevs
该参数用于存放获取的适配器数据,如果查找失败,值为null。这一块的数据结构比较复杂,画张图解释一下。
pcap_if_t的定义如下:
struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};
pcap_addr的定义如下:
struct pcap_addr {
struct pcap_addr *next;
struct sockaddr *addr; /* address */
struct sockaddr *netmask; /* netmask for that address */
struct sockaddr *broadaddr; /* broadcast address for that address */
struct sockaddr *dstaddr; /* P2P destination address for that address */
};
bpf_u_int32的定义如下:
typedef unsigned int u_int;
typedef u_int bpf_u_int32;
其实说白了就是无符号的int类型数据
struct sockaddr的定义如下:
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
其中,sa_family有三个值:2,23,0,分别表示AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNSPEC。但是该结构体有个缺陷,就是sa_data把目标地址和端口信息混在一起了,因此还有一种结构体sockaddr_in,这种结构体被使用的更多:
typedef struct sockaddr_in {
#if(_WIN32_WINNT < 0x0600)
short sin_family;
#else //(_WIN32_WINNT < 0x0600)
ADDRESS_FAMILY sin_family;
#endif //(_WIN32_WINNT < 0x0600)
USHORT sin_port;
IN_ADDR sin_addr;
CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;
但是在该结构体中用的是sockaddr
该数据结构比较复杂,举个例子:
d:
next:下一个设备信息。
name:"rpcap://\\Device\\NPF_{AFC6A50E-665F-4FA1-9419-D7C6DB1B62EE}"
description:0x019715b8 "Network adapter 'Microsoft' on local host"
address:
next:下一个
addr:
ad_family:23
sa_data:00 00 00 00 00 00 fe 80 00 00 00 00 00 00
netmask:
ad_family:0
sa_data:00 00 00 00 00 00 00 00 00 00 00 00 00 00
broadaddr:
ad_family:0
sa_data:00 00 00 00 00 00 00 00 00 00 00 00 00 00
dstaddr:00000000,也就是说这里啥也没有
flags:0
4.errbuf
errbuf参数存放查找失败的信息。