分享
 
 
 

关于winpcap的一些认识

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

关于winpcap的一些认识

Bill yuan

2004-9-29

一.Winpcap简介

Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个free and open source的项目。Winpcap工作于驱动(Driver)层,所以能以很高的效率进行网络操作。

Winpcap提供了以下强大的功能:

1.捕获原始的数据包

2.设置filter,只捕获自己敢兴趣的数据包

3.方便的把捕获的数据包输出到文件和从文件输入

4.发送原始的数据包

5.统计网络流量

6.…..(其它还有很多,我不知道了)

二.Winpcap的安装使用方法

1.到http://winpcap.polito.it下载winpcap的安装包,程序员开发包。

2.执行安装包,这样你的机子就能运行winpcap程序了

3.解压开发包,在VC的option的include和lib中加入winpcap的

include和lib

4. 在你的程序中加入#include <pcap.h>, #include <remote-ext.h>.然后在工程的setting中加入预定义宏:WPCAP,HAVE_REMOTE.导入wpcap.lib库

5.就可以编写wpcap程序了

三.Winpcap的一些基本的功能的实现

一)捕获数据包

1. 枚举所有的可用的设备[pcap_findalldevs_ex](可选)

2. 通过名字打开一个设备[pcap_open()]

在这里可以打开一个文件,只是在打开这个文件之前需要通过pcap_createsrcstr创建相应的name string

3. 设置Filter[pcap_compile, pcap_setfilter] (可选)

4. 捕获数据

有几种捕获数据的方法(捕获数据的数据都是最原始的数据包,即包含数据链路层的数据头)

a. 是以回调的方式[ pcap_loop,pcap_dispatch() ].

这两种方法基本相同,底层收集数据包,当满足一定的条件(timeout 或者缓冲区满),就会调用回调函数,把收集到的原始数据包s,交给用户。他们返回的数据缓冲区包含多个包

b. pcap_next_ex()的方式

每当一个包到到达以后,pcap_next_ex就会返回,返回的数据缓冲区里只包涵一个包。

二)发送包

Winpcap中有发送单个包和发送多个包的方法。这里只说说发送单个包

1. 通过名字打开一个设备[pcap_open]

2. 自己构造一个原始数据包(这个数据包会不经过任何处理就发送出去,所以必须把包中的各个字段设置好。另外这个数据包是包含数据链路层报头的)

3. 使用pcap_sendpacket()发送数据包

三)统计网络流量

1. 通过名字打开一个设备[pcap_open]

通过 read_timeout来设置统计的时间间隔

2. 设置filter[pcap_compile, pcap_setfilter] (可选)

3. 设置设备的为统计模式[ pcap_setmode(MODE_STAT);]

4. 开始统计,pcap_loop/pcap_dispatch()

5.在回调函数中的参数中就包含了统计信息,如下图:

四. 总结

这些东西都是我在学习winpcap的过程中的一些经验和总结。由于我学习winpcap的时间很匆忙,只是按照step by step guide来学习的,所以我对于winpcap的理解也就只能局限与此,希望能在以后有机会深入学习

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//下面是一个应用winpcap写的一个网络流量统计的例子,

// nettraffic.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <pcap.h>

#include <remote-ext.h>

#include <iostream>

#include <winsock2.h>

using namespace std;

//------------------------------------------------------------------------

//------------------------------------------------------------------------

void dispatcher_handler(u_char* user_data, const struct pcap_pkthdr * pkthdr, const u_char *pktdata);

//------------------------------------------------------------------------

int main(int argc, char* argv[])

{

int i;

pcap_if_t* alldevs;

pcap_if_t* dev;

char errorbuf[PCAP_ERRBUF_SIZE];

int choice;

pcap_t* stathandle;

WSADATA wsadata;

struct timeval timestamp;

if( WSAStartup( MAKEWORD(2,2), &wsadata) != 0 )

{

cerr<<"WSAStartup failed [ "<<WSAGetLastError() <<" ]"<<endl;

return (-1);

}

//enum all device

if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, &alldevs, errorbuf ) == -1 )

{

WSACleanup();

cerr<<"pcap_findalldevs_ex failed! ("<<errorbuf<<")"<<endl;

return (-1);

}

for( i=0,dev = alldevs; dev != NULL; dev = dev->next )

{

cout<<++i<<'\t'<<dev->name<<endl;

}

if( i== 0 )

{

WSACleanup();

cerr<<"no device found!"<<endl;

return (-2);

}

//let user choice

while( 1)

{

cout<<"please choice a device:";

cin>>choice;

if( choice >= 1 && choice <=i )

break;

cerr<<"input error, you shall choice a device from upon list"<<endl;

}

//move to the choice device

for( i=0, dev = alldevs; i<choice-1; i++,dev = dev->next );

if( (stathandle = pcap_open( dev->name,

100,

PCAP_OPENFLAG_PROMISCUOUS,

500,

NULL, errorbuf ) ) == NULL )

{

cerr<<"open device failed! [device:"<<dev->name<<"] "

<<errorbuf<<endl;

pcap_freealldevs( alldevs );

WSACleanup();

return (-3);

}

cout<<"is Stat "<<dev->name<<" ..."<<endl;

pcap_freealldevs( alldevs );

pcap_setmode( stathandle, MODE_STAT );

timestamp.tv_sec = 0;

timestamp.tv_usec = 0;

pcap_loop( stathandle, 0, dispatcher_handler,(unsigned char*)&timestamp );

pcap_close( stathandle );

return 0;

}

//------------------------------------------------------------------------

void dispatcher_handler(u_char* user_data, const struct pcap_pkthdr * pkthdr, const u_char *pktdata)

{

static struct timeval tstamp = *( (struct timeval*)user_data );

LARGE_INTEGER Bps,Pps;

unsigned long delay;

char strtime[32];

delay = (pkthdr->ts.tv_sec - tstamp.tv_sec)*1000000 - tstamp.tv_usec + pkthdr->ts.tv_usec;

Pps.QuadPart = ((*(LONGLONG*)(pktdata)) * 1000000 ) / delay;

Bps.QuadPart = ((*(LONGLONG*)(pktdata + 8)) * 1000000 ) / delay;

struct tm* ltime = localtime( &(pkthdr->ts.tv_sec) );

strftime( strtime, sizeof(strtime),"%H:%M:%S", ltime);

printf("%s:", strtime );

printf("\tPps=%I64u\tBps=%I64u\r\n",Pps.QuadPart,Bps.QuadPart);

tstamp = pkthdr->ts;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有