最近使用winpcap在win7下编写网络抓包程序,记录一下。
winpcap是比较老的网络抓包库,在win7和win10上依赖都不是很好,看网上有针对的win10版本的winpcap安装包,这里分享了win10下的winpcap安装包和编译好的库以及winpcap的源程序,连接如下win10pcap安装包
关于win10下重新编译wpcap可参考另外一篇,主要记录了遇到的问题win7编译wpcap
言归正传,本文目的是为了记录下如何提高winpcap的抓包效率,先描述下问题。
问题描述:在PC端使用winpcap编写抓UDP包程序,千兆网卡,另一端是FPGA编写的数据发送端,带宽可达到800M/s,安装官方给的用例实现,存在以下问题。
- 数据发送失败
- 丢包非常严重
1、数据发送失败
使用winpcap编写的发送UDP数据的功能,在本地使用wireshark可以抓到包,但在另一端无法收到,wireshark也抓不到,分析的原因是数据包没有送出网卡,无论调用pcap_sendpacket函数还是pcap_sendqueue_transmit都发送不成功,最终将winpcap替换为Npcap,发送数据成功。有次看来还是winpcap的驱动在win7或者win10上依然存在bug。关于Npcap的详细信息可以查看官网Npcap,其实就是优化后的winpcap。
关于组UDP包的代码
//以太网数据头结构如下
#define ETHER_ADDR_LEN 6
typedef struct ether_header{
u_char ether_dhost[ETHER_ADDR_LEN];
u_char ether_shost[ETHER_ADDR_LEN];
u_short ether_type; //如果上一层为IP协议。则ether_type的值就是0x0800
}ether_header;
/* 4字节的IP地址 */
typedef struct ip_address{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;
/* IPv4 首部 */
typedef struct ip_header{
unsigned char ihl : 4; //ip header length
unsign