1.1 wpcap.dll导出的相应函数接口
库wpcap.dll为
打开与关闭适配器
,提供了下列函数:
pcap_t* pcap_open(const char *source,int snaplen,int flags,
int read_timeout,struct pcap_rmtauth *auth,char *errbuf);
pcap_t* pcap_open_dead(int linktype,int snaplen);
pcap_t* pcap_open_live(const char *device,int snaplen,
int promisc,int to_ms,char *ebuf)
pcap_t* pcap_open_offline(const char *fname, char *errbuf);
void pcap_close(pcap_t *p);
1.1.1 pcap_open函数
函数pcap_open()打开
一个通用的源
,
该函数的原型如下:
pcap_t* pcap_open(const char *source,int snaplen,int flags,
int read_timeout,struct pcap_rmtauth *auth,char *errbuf);
只需要一个单独的调用,函数pcap_open()代替了所有pcap_open_xxx()函数,隐藏了不同pcap_open_xxx()函数之间的区别,因此调用者不用管理不同形式的打开函数。“真正”的打开函数通过源字符串的前缀形式来决定源的类型。该函数可能依赖pcap_createsrcstr()函数,根据新语法来创建保存捕获设备的字符串,并使用pcap_parsesrcstr()函数作对应的解析处理。
参数source是以’\ 0’ 结尾的字符串,包含所需打开源的名称。该源名称必需包含格式化的前缀,并要求符合新“源规范语法”的规定,也可以为NULL。为了使源的语法更容易使用,请记住下列提示:
Ø
函数pcap_findalldevs_ex()返回的适配器能够直接被pcap_open()函数使用
Ø
万一使用者想给pcap_open()函数传递自己的源字符串,记得调用pcap_createsrcstr()创建正确的源标识。
参数snaplen是必须保留的数据包长度。对于过滤器所接收的每个数据包,只有开始snaplen字节的内容被存储到缓冲区中,并被传递给用户层的应用程序。比如,snaplen等于100,意味着每个数据包只有开始的100字节被存储。
参数flags是用来保存几个捕获数据包所需的标识。允许使用的标识在remote-ext.h.文件中定义。
#define PCAP_OPENFLAG_PROMISCUOUS 1
#define PCAP_OPENFLAG_DATATX_UDP 2
#define PCAP_OPENFLAG_NOCAPTURE_RPCAP 4
#define PCAP_OPENFLAG_NOCAPTURE_LOCAL 8
#define PCAP_OPENFLAG_MAX_RESPONSIVENESS 16
参数read_timeout是以毫秒为单位的读取超时时间。读取超时用来处理,捕获一个数据包后,读操作并不必需要立即返回的情况。但这可能等待一些时间以允许捕获更多的数据包,这样用户层的一次读操作就可从操作系统的内核中读取更多的数据包。并不是所有的平台支持读取超时;如果平台不支持,忽略读取超时值。
参数auth是一个指向一个 pcap_rmtauth结构体的指针,该结构体保存远程机器上用户所需的认证信息。万一这不是一个远程捕获,该指针可以被设置为NULL。
参数errbuf指向用户所分配的一个缓冲区,将用来存储该函数的错误信息。
函数返回一个指向” pcap_t”的指针,将作为后续调用的参数(如pcap_sendpacket()等等),其描述了一个已打开的WinPcap会话。如果出现问题,函数返回NULL,并通过” errbuf”变量保存错误信息。
注意:
Ø
源的长度不能比PCAP_BUF_SIZE大。
Ø
下列格式是不允许的“source”字符串:
rpcap:// [to open the first local adapter]
rpcap://hostname/ [to open the first remote adapter]
1.1.2 pcap_open_dead函数
函数创建一个pcap_t结构体,而不开始一个捕获操作。
函数原型如下:
pcap_t* pcap_open_dead(int linktype,int snaplen);
参数linktype为网络链路类型,参数snaplen为每个数据包必须保留的长度。函数返回一个指向” pcap_t”的指针,将作为后续调用的参数。调用wpcap的其它函数时使用pcap_open_dead函数,典型的使用是不打开适配器来编译过滤代码,在pcap_compile_nopcap函数中调用pcap_open_dead函数。
1.1.3 pcap_open_live函数
函数
pcap_open_live()
被用来获取一个数据包捕获的描述符,来查找网络上的数据包。函数原型如下:
pcap_t* pcap_open_live(const char *device,int snaplen,
int promisc,int to_ms,char *ebuf)
参数
device
是描述所打开网络设备的字符串;在
2.2
或更高内核版本的
Linux
系统下,
”any”
与
NULL
的设备参数能被用来从所有的接口捕获数据包。
参数
snaplen
描述数据包所需捕获的最大字节长度。如果该值小于所捕获的数据包大小,只有开始
snaplen
字节的内容被捕获并作为数据包数据提供。一个
65535
的值应该是足够的,在大多数网络情况下,捕获数据包可用的所有数据
。
参数
promisc
是描述该接口是否被设置为混杂模式。现在,这不能工作在
”any”
设备上;如果使用一个
”any”
或
NULL
参数,将忽略
promisc
标识符。将
to_ms
设置为
0
,在支持超时操作的平台上,意味着没有超时。也就是如果没有数据包到达,读操作将永远不会返回。
如果设置成
-1
,则情况恰好相反,无论有没有数据包到达,读操作都会立即返回。
参数
errbuf
指向用户所分配的一个缓冲区,将用来存储该函数的警告与错误信息。
函数返回一个指向
” pcap_t”
的指针,将作为后续调用的参数。
1.1.4 pcap_open_offline函数
函数打开一个采用
tcpdump/libpcap
格式存储的文件读取数据包。
函数原型如下:
pcap_t* pcap_open_offline(const char *fname, char *errbuf);
参数
fname
指定了要打开的文件。该文件与
tcpdump(1)
与
tcpslice(1)
所使用的格式相同。
"-"
是
stdin
的同义词。参数
errbuf
用来返回函数失败的错误信息。
函数返回一个指向” pcap_t”的指针,将作为后续调用的参数。
1.1.5 pcap_close函数
函数
pcap_close()
用来
关闭与
p
关联的文件并释放相关的资源,函数原型如下:
void pcap_close(pcap_t *p);
参数
p
为
pcap_open()
或
pcap_open_XXX()
函数所获取的
”pcap_t”
指针。