网络数据包检测
数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成。
三种访问方式:
BSD Packet Filter(BPF)
SVR4 Datalink Provider Interface(DLPI)
linux SOCK_PACKET interface
libpcap库
安装:
apt-get install libpcap-dev
常用API
捕获数据包
查找缺省的用来捕获数据网络设备
char * pcap_lookupdev ( char * errbuf )//出错时保存系统返回的错误信息。
返回值:
成功时返回指向设备名称的指针,
失败返回NULL
查找指定设备的网络号和子网掩码
int pcap_lookupnet( const char * device,//指向设备名称的指针
bpf_u_int32 * netp,//指向获取的网络号的指针
bpf_u_int32 * maskp,//指向获取的子网掩码的指针
char * errbuf)//出错时保存系统返回的错误信息
返回值:
成功返回0,
失败返回-1,并保存错误信息到errbuf中。
打开一个网络设备用于捕获数据包
pcap_t * pcap_open_live( const char * device,//指向设备名称的指针
int snaplen, //捕获的数据包的长度
int promisc,//网络接口工作模式
int to_ms,//读取数据包时的超时
char * errbuf)//出错时保存系统错误信息
返回值:
成功返回捕获数据包的句柄
失败返回NULL并保存错误信息到errbuf中
捕获下一帧数据
const u_char * pcap_next ( pcap_t * p//pcap_open_live返回的句柄
struct pcap_pkthdr * h)保存捕获的数据包属性的结构体指针
返回值:
成功时返回捕获的数据帧的指针,
失败或无数据返回NULL。
循环捕获多帧数据并处理
typedef void ( * pcap_handler )( u_char *user,
const struct pcap_pkthdr * h,const u_char *bytes);
int pcap_loop( pcap_t * p,//pcap_open_live返回的句柄
int cnt,//要捕获的数据帧的个数
pcap_handler callback,//捕获到一帧数据时执行的处理函数
u_char * user )//传递给callback的参数
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/unix/