惯例简单介绍一下WinPcap。
WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。要进行WinPcap编程需要先下载好WinPcap和开发的SDK,我已经下载好了。 安装程序:WinPcap_4_1_3开发包:WpdPack_4_1_2开发包的include目标包含到VS工程中即可,如下图:
然后把lib目录下面的wpcap.lib文件复制到工程目录下,是编译目录,然后用#pragma comment(lib,"wpcap.lib")加载即可。 发送数据包和获取网关源码如下:
// PcapDemo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include#include#define HAVE_REMOTE #include#include#pragma comment(lib,"wpcap.lib") char* pName = NULL; void getAdapter() { pcap_if_t *alldevs; pcap_if_t *d; int i=0; char errbuf[PCAP_ERRBUF_SIZE]; /* 获取本地机器设备列表 */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs_ex: %sn", errbuf); exit(1); } /* 打印列表 */ for(d= alldevs; d != NULL; d= d->next) { printf("%d. %sn", ++i, d->name); if(pName == NULL) { int nLen = strlen(d->name); pName = new char[nLen<<1]; strcpy_s(pName,nLenname); } if (d->description) printf(" (%s)n", d->description); else printf(" (No description available)n"); } if (i == 0) { printf("nNo interfaces found! Make sure WinPcap is installed.n"); return; } /* 不再需要设备列表了,释放它 */ pcap_freealldevs(alldevs); } void sendPacket() { pcap_t *fp; char errbuf[PCAP_ERRBUF_SIZE]; byte packet[60] = {0}; int p_size = sizeof(packet); /* 打开输出设备 */ if ( (fp= pcap_open(pName, // 设备名 100, // 要捕获的部分 (只捕获前100个字节) PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 1000, // 读超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲 ) ) == NULL) { fprintf(stderr,"nUnable to open the adapter. %s is not supported by WinPcapn", pName); system("pause"); return; } /* 假设在以太网上,设置MAC的目的地址为 01:01:05:01:00:00 */ //01:01:05:01:00:00 //00:1d:72:50:16:c6 packet[0]=0x01; packet[1]=0x01; packet[2]=0x05; packet[3]=0x01; packet[4]=0x00; packet[5]=0x00; /* 设置MAC源地址为 00-23-24-53-74-B0 */ //00 1d 72 50 16 c6 88 a4 ........rP.... packet[6]=0x00; packet[7]=0x1D; packet[8]=0x72; packet[9]=0x50; packet[10]=0x16; packet[11]=0xC6; byte data[48] = { 0x88,0xa4,0x29,0x10 ,0x05,0x9e,0xe9,0x03,0x00,0x13,0x10,0x80,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x03 ,0x00,0x20,0x2b,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0xe9,0x03 ,0x7f,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; /* 填充剩下的内容 */ for(int i=12;i<p_size;i++) packet[i]=data[i-12]; /* 发送数据包 */ if (pcap_sendpacket(fp, packet, p_size /* size */) != 0) { fprintf(stderr,"nError sending the packet: n", pcap_geterr(fp)); system("pause"); return; } system("pause"); } void main(int argc, char **argv) { getAdapter(); printf("n---%s---n",pName); sendPacket(); if(pName != NULL) delete pName; system("pause"); return; }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10859735
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员