Winpcap基础代码
使用Winpcap进行网络数据的截获和发送都需要的一段代码:
#include<PCAP.H> #pragma comment(lib, "wpcap.lib") // #pragma comment(lib, "ws2_32.lib") #include<iostream> using namespace std; // 回调函数 void packet_handler(u_char*param, const struct pcap_pkthdr*header, const u_char*pkt_data); int main() { pcap_if_t *alldevs; pcap_if_t *d; char errbuf[PCAP_ERRBUF_SIZE]; /* 获得网卡的列表 */ if (pcap_findalldevs(&alldevs, errbuf) == - 1){} /* 找到要选择的网卡结构 first NIC */ d=alldevs; // d->next pcap_t*adhandle; // 记录打开的网卡 /* 打开选择的网卡 */ /* 65536-max mac packet 1-混杂模式 1000-1s超时 */ if((adhandle=pcap_open_live(d->name, 65536, 1, 1000,errbuf)) == NULL){} // 提取子网掩码 u_int netmask; if(d->addresses) netmask=((sockaddr_in*)d->addresses->netmask)->sin_addr.S_un.S_addr; else netmask= 0xffffffff; // 无效地址子网掩码全1 /* 释放列表 */ pcap_freealldevs(alldevs); /* -------------------------------------------------------------------------- */ u_char data[ 100]={ 0}; /* 发送数据报文 */ int i= 50000; while(i--) pcap_sendpacket(adhandle,data, 100); /* -------------------------------------------------------------------------- */ /* 抓取数据报文 */ if(pcap_datalink(adhandle)!=DLT_EN10MB){} // 以太网 /* 配置过滤器 */ bpf_program fcode; char packet_filter[]= " ip and udp "; // 编译过滤规则 if(pcap_compile(adhandle,&fcode,packet_filter, 1,netmask)< 0){} if(pcap_setfilter(adhandle,&fcode)< 0){} pcap_loop(adhandle, 0,packet_handler,NULL); pcap_close(adhandle); return 0; } void packet_handler(u_char*param, const struct pcap_pkthdr*header, const u_char*pkt_data) { struct tm ltime; char timestr[ 16]; time_t t=(time_t)header->ts.tv_sec; localtime_s(<ime,&t); /* 将时间戳转变为易读的标准格式 */ strftime( timestr, sizeof timestr, " %H:%M:%S ", <ime); printf( " %s,%.6d len:%d caplen:%d\n ", timestr, header->ts.tv_usec, header->len,header->caplen); }
Winpcap参考手册链接: