一般涉及到网络编程,我们会用上层的socket相关API进行,但有些时候我们需要从底层进行抓包,在Windows上,我们可以用WinPcap来做这件事。
官网地址:https://www.winpcap.org/install/default.htm
首先在上面圈中的两个地方分别下载安装包和开发包。
然后先安装(注意这个是必须先做的,不然哪怕运行代码也会失败),安装一路next就行了,里面有一个勾选项是问要不要自动打开WinPcap驱动的,记得勾选上(默认就是这样的),不要手贱点掉,不然要自己去开(不知道怎么开),否则运行代码会找不到网络设备。
做完这些解压开发包,会看到里面自带有例子工程,直接用VS2017升级后打开即可(可能需要换Windows的sdk版本)。
比如检测网络设备的代码存放在“E:\winpcap\WpdPack_4_1_2\WpdPack\Examples-pcap\basic_dump_ex”这个路径下,用VS打开之后将其设置为启动项编译就能看到自己的网络设备,并进行监听。比如本人有两张网卡则会看到如下的设备列表:
如果只有一张网卡则会直接输出监听的结果。
具体的代码实现参照示例就行了,写的很好,才100左右行,无需要本人再冗述。
//忽视老接口安全警告
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include "pcap.h"
int main()
{
pcap_t *adhandle;//传感器对象句柄
int res;//返回值
char errbuf[PCAP_ERRBUF_SIZE];//错误信息
struct tm *ltime;
char timestr[16];
struct pcap_pkthdr *header;
const u_char *pkt_data;
time_t local_tv_sec;
char drivename[100] = "\\Device\\NPF_{5279D3EA-C863-485E-A1EA-5D1A18A85734}";
//打开抓包器
if ((adhandle = pcap_open_live(drivename,65536,1,1000,errbuf)) == NULL)
{
printf("网络打开错误!请用专用软件查看\n");
return -1;
}
//获得包数据
while ((res = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0)
{
if (res == 0)
continue;
}
if (res == -1)
{
printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
return -1;
}
pcap_close(adhandle);
return 0;
}