惯例简单介绍一下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)
站点信息
- 文章2313
- 用户1336
- 访客11757652
每日一句
Life is short; Live it!
人生苦短,活出精彩。
人生苦短,活出精彩。
新会员