关于winpcap的一些认识

原创 2004年09月29日 13:37:00

关于winpcap的一些认识<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                                                                         Bill yuan

                                                                                                          <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2004-9-29

 

一.Winpcap简介

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

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

1.捕获原始的数据包

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

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

4.发送原始的数据包

5.统计网络流量

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

 

二.Winpcap的安装使用方法

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

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

     3.解压开发包,在VCoptionincludelib中加入winpcap

includelib

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.在回调函数中的参数中就包含了统计信息,如下图:

      
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

 

    

. 总结

这些东西都是我在学习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;

}

 

winpcap的一些认识

一.Winpcap简介      Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个freeandopensource的项目。Winpcap工作于驱动(Driver)层,...
  • VxD1
  • VxD1
  • 2008年10月02日 17:48
  • 572

SVM入门学习总结

因为做项目要用到SVM,就自学了几个月。在中国知网上看了很多论文,但现在又忘的差不多了,看来勤做笔记很重要。现在说一下我学习SVM的经验。 一、SVM(支持向量机)是一种常见的机器学习算法,主要用于...
  • gaiyindexingqiu
  • gaiyindexingqiu
  • 2016年07月23日 15:51
  • 523

关于索引的一些认识

索引的目的就是为了避免 full table scan. 索引是可以手工创建的。建表的时候会自动创建主键索引。 索引的类型: B-Tree IndexesBitmap IndexesHash Inde...
  • theorytree
  • theorytree
  • 2011年03月22日 14:53
  • 1020

CodeBlocks 13.12设置winpcap开发环境

WinPcap 4.0.1在线中文手册:http://www.ferrisxu.com/WinPcap/html/index.html   本文以CodeBlocks 13.12和WinPcap 4....
  • kxcfzyk
  • kxcfzyk
  • 2014年02月28日 09:00
  • 2850

关于线程的理解

1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完...
  • u010214269
  • u010214269
  • 2015年08月29日 23:27
  • 808

关于端口(port)的一点理解

端口—物理端口(又称“接口”,例如计算机的I/O端口,可见。) —虚拟端口(计算机,路由或交换机内的端口,不可见) 根据提供服务类型,虚拟端口分为: ...
  • JingwenCai
  • JingwenCai
  • 2017年02月03日 23:13
  • 243

谈谈我对资本主义和社会主义的一点认识

对于中国国家制度的性质,主要分3种观点:中国特色社会主义,政治上的社会主义-经济上的资本主义,社会主义的资本化。    对于美国等欧美资本主义国家的性质,主要分3种观点:资本主义、资本主义的高级阶段、...
  • FansUnion
  • FansUnion
  • 2014年10月26日 09:16
  • 1843

一些时间类型的总结

1. 系统时间函数         在编程时,时间函数不可避免的会被使用。linux系统下相关时间的数据结构有time_t,timeval,timespec,tm,clock_t; windows下...
  • pud_zha
  • pud_zha
  • 2013年10月01日 01:52
  • 830

对时间的一些操作总结

由于项目要对时间进行一些数学运算,要使用 access 数据库交互一些时间的信息,于是乎便有了下文。。。 CTime Comparison OperatorsBOOL operator ==( CTi...
  • xum2008
  • xum2008
  • 2010年09月08日 17:15
  • 464

关于一些初级ACM竞赛题目的分析和题解(一)。

关于一些初级ACM竞赛题目的分析和题解(一)   故事发生在在2017年年底,受我的室友cy1999巨巨的影响下,第一次接触到ACM竞赛,也是作为一名编程小白,第一次感受到编程语言的魅力。用竞赛这种...
  • monster_ayb
  • monster_ayb
  • 2018年01月27日 14:10
  • 102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于winpcap的一些认识
举报原因:
原因补充:

(最多只允许输入30个字)