winpcap的一些认识

一.Winpcap简介

      Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个freeandopensource的项目。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创建相应的namestring

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的时间很匆忙,只是按照stepbystepguide来学习的,所以我对于winpcap的理解也就只能局限与此,希望能在以后有机会深入学习



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

//nettraffic.cppefinestheentrypointfortheconsoleapplication.

//



#include"stdafx.h"

#include<pcap.h>

#include<remote-ext.h>

#include<iostream>

#include<winsock2.h>



usingnamespacestd;

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



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

voiddispatcher_handler(u_char*user_data,conststructpcap_pkthdr*pkthdr,constu_char*pktdata);



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

intmain(intargc,char*argv[])

{

      int                                      i;

      pcap_if_t*                         alldevs;

      pcap_if_t*                         dev;

      char                            errorbuf[PCAP_ERRBUF_SIZE];

      int                                      choice;

      pcap_t*                             stathandle;

      WSADATA                             wsadata;

      structtimeval              timestamp;

      

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

      {

             cerr<<"WSAStartupfailed["<<WSAGetLastError()<<"]"<<endl;

             return(-1);

      }

      

      //enumalldevice

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

      {

             WSACleanup();

             cerr<<"pcap_findalldevs_exfailed!("<<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<<"nodevicefound!"<<endl;

             return(-2);

      }

      

      //letuserchoice

      while(1)

      {

             cout<<"pleasechoiceadevice:";

             cin>>choice;

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

                    break;

            

             cerr<<"inputerror,youshallchoiceadevicefromuponlist"<<endl;

      }

      

      //movetothechoicedevice

      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<<"opendevicefailed![device:"<<dev->name<<"]"

                    <<errorbuf<<endl;

            

             pcap_freealldevs(alldevs);

             WSACleanup();

             return(-3);

      }

      

      cout<<"isStat"<<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,(unsignedchar*)&timestamp);

      pcap_close(stathandle);



      return0;

}

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

voiddispatcher_handler(u_char*user_data,conststructpcap_pkthdr*pkthdr,constu_char*pktdata)

{

      staticstructtimeval      tstamp=*((structtimeval*)user_data);

      LARGE_INTEGER                 Bps,Pps;

      unsignedlong              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;



      structtm*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;

}
  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。 这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。 WinPcap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包 将原始数据包通过网络发送出去 收集并统计网络流量信息 以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。 所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。 如果您现在就想开始摸索这些功能,您可以直接进入 WinPcap用户手册. 哪些程序在使用WinPcap WinPcap可以被用来制作许多类型的网络工具,比如具有分析,解决纷争,安全和监视功能的工具。特别地,一些基于WinPcap的典型应用有: 网络与协议分析器 (network and protocol analyzers) 网络监视器 (network monitors) 网络流量记录器 (traffic loggers) 网络流量发生器 (traffic generators) 用户级网桥及路由 (user-level bridges and routers) 网络入侵检测系统 (network intrusion detection systems (NIDS)) 网络扫描器 (network scanners) 安全工具 (security tools) 什么是WinPcap做不到的 WinPcap能 独立地 通过主机协议发送和接受数据,如同TCP-IP。这就意味着WinPcap不能阻止、过滤或操纵同一机器上的其他应用程序的通讯:它仅仅能简单地"监视"在网络上传输的数据包。所以,它不能提供类似网络流量控制、服务质量调度和个人防火墙之类的支持

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值