C++语法 网络相关函数
C++ 函数pcap_findalldevs
2、捕获数据包
2.1、获取本地网络设备列表
在WinPcap中,获取本地网络设备列表是通过函数pcap_findalldevs实现的,函数原型如下所示:
int pcap_findalldevs (pcap_if_t **alldevsp, char *errbuf);
// alldevsp: 存储本地网络设备列表
// errbuf: 存储错误信息
// 返回值:int,如果发生错误将返回-1,执行成功将返回0
具体实例如下所示:
pcap_if_t* alldevs;
char errbuf[PCAP_ERRBUF_SIZE];
// 获取本地机器的设备列表
if( pcap_findalldevs(&alldevs, errbuf) == -1)
{
printf(“>>> Error - Error in pcap_findalldevs: %s\n”, errbuf);
Pcap_open_live
pcap_t* pcap_open_live
( const char * device,
int snaplen,
int promisc,
int to_ms,
char * ebuf
)
从网络打开实时捕获。
tmp_if_info->pcap_handle = pcap_open_live(tmp_if_info->interface.c_str(), BUFSIZ, PROMISCUOUS_MODE, 1000, tmp_if_info->errBuf);
pcap_open_live()用于获取数据包捕获描述符以查看网络上的数据包。
device是指定要打开的网络设备的字符串; 在具有2.2或更高版本内核的Linux系统上,可以使用“any”或NULL的设备参数来捕获来自所有接口的数据包。
snaplen指定要捕获的最大字节数。如果该值小于捕获的数据包的大小,则该数据包的第一个snaplen字节将被捕获并作为数据包数据提供。在大多数(如果不是全部)网络中,值65535应该足以捕获数据包中可用的所有数据。
promisc指定是否将接口置于混杂模式。(注意,即使这个参数是假的,接口也可能在混杂模式下出于某些其他原因。)现在,这不适用于“任何”设备; 如果提供了“any”或NULL的参数,则将忽略promisc标志。
to_ms指定读取超时(以毫秒为单位)。读取超时用于安排在看到数据包时读取不一定立即返回,但是在一次操作中,等待一段时间才能允许更多数据包到达并从操作系统内核读取多个数据包。
并非所有平台都支持读取超时; 在没有的平台上,读取超时被忽略。对于支持读取超时的平台,to_ms的零值将导致读取永远等待,以允许足够的数据包到达,没有超时。errbuf用于返回错误或警告文本。
当pcap_open_live()失败并返回NULL时,它将被设置为错误文本。
当pcap_open_live()成功时,errbuf也可能设置为警告文本; 为了检测这种情况,调用者在调用pcap_open_live()之前应该在errbuf中存储一个零长度的字符串,并且如果errbuf不再是零长度字符串,则向用户显示警告。
pcap_next
pcap_next()的原型
u_char *pcap_next(pcap_t *p, s第一个参数是会话句柄,第二个参数是指向一个包括了当前数据包总体信息(被捕捉时的时间,包的长度,其被指定的部分长度)的结构体的指针(在这里只有一个片断,只作为一个示例)truct pcap_pkthdr *h)
tmp_buf = pcap_next(tmp_if_info->pcap_handle, &tmp_if_info->pcap_data);