收集网络流量统计

本课程展示了WinPcap的另一个高级功能:收集网络流量统计信息的能力。统计引擎利用内核级包过滤器对传入的数据包进行有效的分类。如果您想了解更多详细信息,可以参考NPF驱动程序内部手册。

为了使用此功能,程序员必须打开适配器并将其置于统计 模式。这可以用pcap_setmode()完成。特别地,MODE_STAT必须用作该函数的模式参数。

通过统计模式,监控TCP流量负载的应用程序是几行代码。以下示例显示如何执行此操作。

#include <stdlib.h>
#include <stdio.h>#include <pcap.h>void usage();void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *);void main(int argc, char **argv)
{
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
struct timeval st_ts;
u_int netmask;
struct bpf_program fcode;/* Check the validity of the command line */if (argc != 2){usage();return;}/* Open the output adapter */if ( (fp= pcap_open(argv[1], 100, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf) ) == NULL){fprintf(stderr,"\nUnable to open adapter %s.\n", errbuf);return;}/* Don't care about netmask, it won't be used for this filter */netmask=0xffffff; //compile the filterif (pcap_compile(fp, &fcode, "tcp", 1, netmask) <0 ){fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");/* Free the device list */return;}//set the filterif (pcap_setfilter(fp, &fcode)<0){fprintf(stderr,"\nError setting the filter.\n");pcap_close(fp);/* Free the device list */return;}/* Put the interface in statstics mode */if (pcap_setmode(fp, MODE_STAT)<0){fprintf(stderr,"\nError setting the mode.\n");pcap_close(fp);/* Free the device list */return;}printf("TCP traffic summary:\n");/* Start the main loop */pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts);pcap_close(fp);return;
}void dispatcher_handler(u_char *state, const struct pcap_pkthdr *header, const u_char *pkt_data)
{struct timeval *old_ts = (struct timeval *)state;u_int delay;LARGE_INTEGER Bps,Pps;struct tm ltime;char timestr[16];time_t local_tv_sec;/* Calculate the delay in microseconds from the last sample. *//* This value is obtained from the timestamp that the associated with the sample. */delay=(header->ts.tv_sec - old_ts->tv_sec) * 1000000 - old_ts->tv_usec + header->ts.tv_usec;/* Get the number of Bits per second */Bps.QuadPart=(((*(LONGLONG*)(pkt_data + 8)) * 8 * 1000000) / (delay));/*                                            ^      ^|      ||      | |      |converts bytes in bits --       ||delay is expressed in microseconds --*//* Get the number of Packets per second */Pps.QuadPart=(((*(LONGLONG*)(pkt_data)) * 1000000) / (delay));/* Convert the timestamp to readable format */local_tv_sec = header->ts.tv_sec;localtime_s(&ltime, &local_tv_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", &ltime);/* Print timestamp*/printf("%s ", timestr);/* Print the samples */printf("BPS=%I64u ", Bps.QuadPart);printf("PPS=%I64u\n", Pps.QuadPart);//store current timestampold_ts->tv_sec=header->ts.tv_sec;old_ts->tv_usec=header->ts.tv_usec;
}void usage()
{printf("\nShows the TCP traffic load, in bits per second and packets per second.\nCopyright (C) 2002 Loris Degioanni.\n");printf("\nUsage:\n");printf("\t tcptop adapter\n");printf("\t You can use \"WinDump -D\" if you don't know the name of your adapters.\n");exit(0);
}

在启用统计模式之前,用户可以选择设置一个过滤器,该过滤器定义要监视的网络流量子集。有关详细信息,请参阅过滤表达式语法中的段落。如果没有设置过滤器,将监视所有流量。

一旦

  • 过滤器设置
  • pcap_setmode()被调用
  • 使用pcap_loop()启用回调调用

接口描述符在统计模式下开始工作。注意pcap_open()的第四个参数(to_ms):它定义统计样本之间的间隔。回调函数接收由驱动程序计算的样本每几毫秒。这些样本被封装在回调函数的第二和第三个参数中,如下图所示:

提供两个64位计数器:最后一个间隔期间的数据包数量和字节数。

在该示例中,适配器打开超时1000 ms。这意味着dispatcher_handler()每秒调用一次。此时,只保存tcp数据包的过滤器被编译和设置。然后调用pcap_setmode()和pcap_loop()。请注意,struct timeval指针作为用户参数传递给pcap_loop()。该结构将用于存储时间戳以计算两个样本之间的间隔。dispatcher_handler()使用此间隔来获取每秒的位数和每秒的数据包,然后在屏幕上打印这些值。

最后要注意的是,这个例子比传统方式捕获数据包的程序要高得多,并且在用户级别上计算统计信息。统计模式需要最小数量的数据副本和上下文切换,因此CPU被优化。此外,需要非常少量的内存。

c++ winpcap开发(9)相关推荐

  1. 在Visual Studio 2005下配置WinPcap开发环境

    在Visual Studio 2005下配置WinPcap开发环境 http://www.winpcap.org/archive/ 4.1beta5_WpdPack.zip http://www.wi ...

  2. winpcap 开发

    Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器:获取指定适配器信息(比如名称和描述信息):捕获指定网卡的数据封包:发送数据封包:过滤捕获的包以获取特定包等. 首先到htt ...

  3. socket编程之DEV C++配置winpcap开发环境并编写网络嗅探器sniffer

    欢迎关注我的个人博客:www.zuzhiang.cn 期末计算机网络课程设计让做一个网络嗅探器,要求可以检测和选择网卡,并打开到混杂模式,监听局域网中的所有数据包并解析出所用网络协议以及首部各个字段的 ...

  4. codeblocks配置winpcap开发环境

    转载请注明出处,谢谢_ (:з」∠)_ 起因 最近作业要用Winpcap开发包分析.pcap文件实现报文字段的识别-本来打算用Visual Studio写,不过想起以前打OJ的时候都用Code::Bl ...

  5. Dev-C++ 配置 WinPcap 开发环境

    VC++ 6.0实在是太老了,自己并不愿意在这个平台上开发,所以转而使用Dev-C++,以下是综合网上的教程和自己的试验总结出的用Dev-C++进行WinPcap网络开发的所需的环境配置工作: 首先是 ...

  6. 一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境

    0.说在前面的话 1) 本文将以一个初学者的角度,一步一步几乎是从0开始讲述如何完成一个基于winpcap+MFC的sniffer(嗅探器)当然我指的"0"并不是指连编程都不会,如 ...

  7. 基于winpcap开发的相关资料

    2019独角兽企业重金招聘Python工程师标准>>> http://www.oschina.net/code/snippet_196111_7100 http://wenku.ba ...

  8. c++ winpcap开发(8)

    发送数据包 虽然名称WinPcap清楚地表明图书馆的目的是分组捕获,但还提供了其他有用的原始网络功能.其中,用户可以找到一组完整的功能来发送数据包. 请注意,原来的libpcap库目前没有提供任何方式 ...

  9. c++ winpcap开发(7)

    处理离线转储文件 在这个课程中,我们将学习如何处理数据包捕获到一个文件(转储到文件).WinPcap提供广泛的功能来将文件的网络流量保存到文件并读取转储的内容 - 本课将介绍如何使用所有这些功能.我们 ...

最新文章

  1. nginx+uwsgi+django1.6 配置过程
  2. SSH-Auditor:一款SSH弱密码探测工具
  3. 总线上加三个终端电阻可以吗_什么是RS485总线?怎么使用RS485总线?
  4. 在树莓派上借助Mono + Jexus 布署 .Net 4.0 WebForm应用
  5. 显卡A卡和N卡有什么区别
  6. 在gitlab 中使用webhook 实现php 自动部署git 代码
  7. UIKit应用 - Swift 版本: 3.让UITableViewCell的背景色渐变
  8. 数据仓库搭建——Inmon与Kimball
  9. KVM虚拟化技术原理简介
  10. Weblogic之端口查看
  11. forward与sendRedirect区别
  12. [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  13. clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理
  14. SVN中删除彻底删除某一个版本
  15. elasticsearch报错 all shards failed修复
  16. 穷人python入门教程视频_《穷》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  17. nginx openresty waf动态黑名单 白名单 、centos 、windows下部署
  18. Lattice ddr3教程全攻略之仿真篇
  19. 农村将迎来重大爆发!传统农业链条正在重塑,关键一步已经迈出!
  20. windows11 版本 business editions consumer editions 区别介绍

热门文章

  1. DESeq2差异基因分析和批次效应移除
  2. c++语言while循环,c++ c语言while 循环语句入门基础教程
  3. 原有磁盘上创建lvm_Linux 系统管理及服务配置实战-第12章 磁盘管理3(连载)
  4. php 解压rar文件怎么打开方式,php 解压rar文件
  5. hibernate实战第二版 蒲成带目录_太NB了! 阿里程序员带你玩转Spring:脑图+实战五+面试百问+知识总结...
  6. java object转泛型_JAVA快速入门——基本结构、基本数据类型
  7. 学生汽车网页设计作品静态HTML网页模板源码 大学生汽车网站制作 简单汽车网页设计成品
  8. Android逆向笔记-通过tracerPid对抗IDA调试
  9. 系统架构师学习笔记-系统开发基础知识(一)
  10. C++工作笔记-3种方法对数据类型进行拆分(可用于各种协议)