Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。
首先到http://www.winpcap.org/install/default.htm下载安装winpcap 驱动和DLL组件。
然后到http://www.winpcap.org/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:/WpdPack_4_0_2/WpdPack,可以看到里面包含了:Lib,Include,文档和示例程序。
首先创建一个C++控制台程序,设置如下:
1) 在“Configuration Properties -> C/C++ -> General”中,在Additional Include Directories加入Include路径(“C:/WpdPack_4_0_2/WpdPack/Include”)。
2) 在 “Configuration Properties -> Linker -> General” 中,在Additional Library Directories中加入 winpcap 库文件路径 ( “C:/WpdPack_4_0_2/WpdPack/Lib” ) 。
3) 在“Configuration Properties -> Linker -> Input”中, Additional Dependencies 加入用到的两个winpcap 库文件(wpcap.lib and Packet.lib ) 。
4) 为了使用Winpcap的远程访问,必须在预处理器中加入HAVE_REMOTE
示例程序1 获取适配器列表
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<pcap.h>
int_tmain(intargc,_TCHAR*argv[])
{
pcap_if_t*allAdapters;//适配器列表
pcap_if_t*adapter;
charerrorBuffer[PCAP_ERRBUF_SIZE];//错误信息缓冲区
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,
&allAdapters,errorBuffer)==-1)
{//检索机器连接的所有网络适配器
fprintf(stderr,"Errorinpcap_findalldevs_exfunction:%s/n",errorBuffer);
return-1;
}
if(allAdapters==NULL)
{//不存在人任何适配器
printf("/nNoadaptersfound!MakesureWinPcapisinstalled./n");
return0;
}
intcrtAdapter=0;
for(adapter=allAdapters;adapter!=NULL;adapter=adapter->next)
{//遍历输入适配器信息(名称和描述信息)
printf("/n%d.%s",++crtAdapter,adapter->name);
printf("--%s/n",adapter->description);
}
printf("/n");
pcap_freealldevs(allAdapters);//释放适配器列表
system("PAUSE");
return0;
}
示例程序2 打开指定适配器并捕获数据包
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include<pcap.h>
int_tmain(intargc,_TCHAR*argv[])
{
pcap_if_t*allAdapters;//适配器列表
pcap_if_t*adapter;
pcap_t*adapterHandle;//适配器句柄
structpcap_pkthdr*packetHeader;
constu_char*packetData;
charerrorBuffer[PCAP_ERRBUF_SIZE];//错误信息缓冲区
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,
&allAdapters,errorBuffer)==-1)
{//检索机器连接的所有网络适配器
fprintf(stderr,"Errorinpcap_findalldevs_exfunction:%s/n",errorBuffer);
return-1;
}
if(allAdapters==NULL)
{//不存在任何适配器
printf("/nNoadaptersfound!MakesureWinPcapisinstalled./n");
return0;
}
intcrtAdapter=0;
for(adapter=allAdapters;adapter!=NULL;adapter=adapter->next)
{//遍历输入适配器信息(名称和描述信息)
printf("/n%d.%s",++crtAdapter,adapter->name);
printf("--%s/n",adapter->description);
}
printf("/n");
//选择要捕获数据包的适配器
intadapterNumber;
printf("Entertheadapternumberbetween1and%d:",crtAdapter);
scanf_s("%d",&adapterNumber);
if(adapterNumber<1||adapterNumber>crtAdapter)
{
printf("/nAdapternumberoutofrange./n");
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
adapter=allAdapters;
for(crtAdapter=0;crtAdapter<adapterNumber-1;crtAdapter++)
adapter=adapter->next;
//打开指定适配器
adapterHandle=pcap_open(adapter->name,//nameoftheadapter
65536,//portionofthepackettocapture
//65536guaranteesthatthewhole
//packetwillbecaptured
PCAP_OPENFLAG_PROMISCUOUS,//promiscuousmode
1000,//readtimeout-1millisecond
NULL,//authenticationontheremotemachine
errorBuffer//errorbuffer
);
if(adapterHandle==NULL)
{//指定适配器打开失败
fprintf(stderr,"/nUnabletoopentheadapter/n",adapter->name);
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
printf("/nCapturesessionstartedonadapter%s/n",adapter->name);
pcap_freealldevs(allAdapters);//释放适配器列表
//开始捕获数据包
intretValue;
while((retValue=pcap_next_ex(adapterHandle,
&packetHeader,
&packetData))>=0)
{
//timeoutelapsedifwereachthispoint
if(retValue==0)
continue;
//打印捕获数据包的信息
printf("lengthofpacket:%d/n",packetHeader->len);
}
//ifwegethere,therewasanerrorreadingthepackets
if(retValue==-1)
{
printf("Errorreadingthepackets:%s/n",pcap_geterr(adapterHandle));
return-1;
}
system("PAUSE");
return0;
}
示例程序3 发送数据封包
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<pcap.h>
int_tmain(intargc,_TCHAR*argv[])
{
pcap_if_t*allAdapters;//适配器列表
pcap_if_t*adapter;
pcap_t*adapterHandle;//适配器句柄
u_charpacket[20];//待发送的数据封包
charerrorBuffer[PCAP_ERRBUF_SIZE];//错误信息缓冲区
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,
&allAdapters,errorBuffer)==-1)
{//检索机器连接的所有网络适配器
fprintf(stderr,"Errorinpcap_findalldevs_exfunction:%s/n",errorBuffer);
return-1;
}
if(allAdapters==NULL)
{//不存在人任何适配器
printf("/nNoadaptersfound!MakesureWinPcapisinstalled./n");
return0;
}
intcrtAdapter=0;
for(adapter=allAdapters;adapter!=NULL;adapter=adapter->next)
{//遍历输入适配器信息(名称和描述信息)
printf("/n%d.%s",++crtAdapter,adapter->name);
printf("--%s/n",adapter->description);
}
printf("/n");
//选择适配器
intadapterNumber;
printf("Entertheadapternumberbetween1and%d:",crtAdapter);
scanf_s("%d",&adapterNumber);
if(adapterNumber<1||adapterNumber>crtAdapter)
{
printf("/nAdapternumberoutofrange./n");
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
adapter=allAdapters;
for(crtAdapter=0;crtAdapter<adapterNumber-1;crtAdapter++)
adapter=adapter->next;
//打开指定适配器
adapterHandle=pcap_open(adapter->name,//nameoftheadapter
65536,//portionofthepackettocapture
//65536guaranteesthatthewhole
//packetwillbecaptured
PCAP_OPENFLAG_PROMISCUOUS,//promiscuousmode
1000,//readtimeout-1millisecond
NULL,//authenticationontheremotemachine
errorBuffer//errorbuffer
);
if(adapterHandle==NULL)
{//指定适配器打开失败
fprintf(stderr,"/nUnabletoopentheadapter/n",adapter->name);
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
pcap_freealldevs(allAdapters);//释放适配器列表
//创建数据封包
//设置目标的MAC地址为01:01:01:01:01:01
packet[0]=0x01;
packet[1]=0x01;
packet[2]=0x01;
packet[3]=0x01;
packet[4]=0x01;
packet[5]=0x01;
//设置源的MAC地址为02:02:02:02:02:02
packet[6]=0x02;
packet[7]=0x02;
packet[8]=0x02;
packet[9]=0x02;
packet[10]=0x02;
packet[11]=0x02;
//设置封包其他部分内容
for(intindex=12;index<20;index++)
{
packet[index]=0xC4;
}
//发送数据封包
if(pcap_sendpacket(adapterHandle,//theadapterhandle
packet,//thepacket
20//thelengthofthepacket
)!=0)
{
fprintf(stderr,"/nErrorsendingthepacket:/n",pcap_geterr(adapterHandle));
return-1;
}
system("PAUSE");
return0;
}
参考文章:
1,Introduction to the Winpcap Networking Libraries
分享到:
相关推荐
网络编程底层函数库WinPCAP资料,WinPcap网络程序开发包下载及安装说明,以及WinPcap的开发教程。
底层网络程序开发,包含驱动程序和开发包,
基于winpcap网络嗅探器 VC++源码+说明文档资料 实验内容 开发出一个 Windows 平台上的网络嗅探工具,能显示所捕获的数据包,并能 做相应的分析和统计。主要内容如下: 1、列出监测主机的所有网卡,选择一个网卡,...
这篇教程将会指引读者逐步了解WinPcap编程, 从简单的基础函数(获取网络接口列表, 捕捉数据包)到更高级的内容(处理发送队列, 网络流量统计). 教程中包括一些代码片断, 以及一些简单但完整的例子, 读者可以参考这些...
WinPCap开发库 及 英文技术文档 4.0.1
里面包括了很多winpcap开发文档,以及开发过程问题出现的问题 一些笔记
winpcap开发包 winpcap开发 winpcap编程
基于WinPcap的网络流量统计源码 1.本程序利用WinPcap开发包进行编写; 2.WinPcap的使用参见:http://www.coffeecat.net.cn/WinPcap/html/main.html 3.平台:WinXP,VC6,WinPcap VC2005 编译通过 运行需要安装VC6和...
Winpcap开发包
基于winpcap的抓包工具,编译能通过的。
Winpcap开发文档 (中文版),配套使用
WinPcap开发包的使用
内含WinpCap V4.1.2开发包及V4.1.3源码
这是一些winpcap的编程资料,适合初学者使用,有一些简单的小程序,已经经过调试。
利用改造后的winpcap.dll实现网卡到网卡链路层可靠通讯,实现非TCP/IP方式文件传输。
Winpcap头文件,库 1 安装驱动 WinPcap_4_1_2.exe 2 解压开发包 WpdPack_4_1_2.zip
WinPcap开发一:零基础入门.doc
Winpcap4.02安装包和开发包 其中开发包是用来开发编程使用,含有Winpcap的源文件,Winpcap4.02版本是当前最稳定版
包括winpcap头文件,源文件,lib及WinPcap中文帮助手册
。