libpcap介绍
libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。
Linux下安装libpcap
命令行安装
sudo apt-get install libpcap-dev
分析
struct pcap_pkthdr * pkthdr
libpcap的包头
struct pcap_pkthdr
{
struct timeval ts; // 抓到包的时间
bpf_u_int32 caplen; // 表示抓到的数据长度,抓取的长度
bpf_u_int32 len; // 表示数据包的实际长度,本来应有长度
}
const u_char * packet(真正的包的数据)
pcap_open_offline函数
函数说明:pcap_t *pcap_open_offline(char *fname, char *ebuf)
函数功能:打开以前保存捕获数据包的文件,用于读取。
参数说明:fname参数指定打开的文件名。ebuf参数则仅在pcap_open_offline()函数出错返回NULL时用于传递错误消息。
pcap_next函数
函数说明:const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
函数功能:捕获数据包,返回一个无符号指针指向抓取到的数据
示例
运行命令
gcc test.c -o test -lpcap
#include <stdio.h>
#include <pcap.h>
char errbuf[512] = "";
typedef unsigned char u_char;
int main()
{
int i = 0;
struct pcap_pkthdr pkthdr;
pcap_t *pcap_str = pcap_open_offline("./test.pcapng", errbuf);
if(!pcap_str)
{
printf("error file format\n");
}
while(1)
{
const u_char *pkt_buff = pcap_next(pcap_str, &pkthdr);
if(!pkt_buff)
{
printf("file read over\n");
return 0;
}
for(i = 0; i < pkthdr.caplen; i++)
{
printf("%d ", pkt_buff[i]);
}
}
return 0;
}