网络程序设计IP数据包流量统计

合集下载

Linux系统网络流量分析脚本使用Python编写的Linux网络流量分析脚本

Linux系统网络流量分析脚本使用Python编写的Linux网络流量分析脚本

Linux系统网络流量分析脚本使用Python编写的Linux网络流量分析脚本Linux系统是一种广泛应用的操作系统,它的高度可定制性和稳定性使其成为许多企业和个人选择的首选系统。

然而,随着网络的不断发展和应用的扩大,对网络流量的分析和监控变得越来越重要。

本文将介绍如何使用Python编写一个简单但功能强大的Linux网络流量分析脚本。

一、概述网络流量分析是指对在网络中传输的数据进行收集、分析和解释,从而得出有关网络性能和安全性的信息。

通过对网络流量的监控和分析,可以实时了解网络的使用情况、识别潜在的网络隐患,并优化网络资源的分配和使用。

二、Python编程语言Python是一种简单易学、功能丰富的高级编程语言,它具有良好的可读性和可维护性,适合快速开发网络应用和工具。

在Linux系统中,Python被广泛应用于系统管理、网络编程等领域。

三、使用Python进行网络流量分析1. 安装Python在Linux系统中,可以通过包管理工具安装Python。

比如,在Debian或Ubuntu系统中,可以使用以下命令安装Python:```sudo apt-get install python```2. 安装相关库Python拥有许多强大的网络分析库,可以帮助我们实现网络流量分析的功能。

一些常用的库包括pyshark、Scapy等。

通过包管理工具,我们可以轻松安装这些库,例如:```sudo pip install pysharksudo pip install scapy```3. 编写脚本下面是一个简单的Python脚本示例,用于抓取并分析网络流量:```pythonimport pysharkdef analyze_traffic(interface):capture = pyshark.LiveCapture(interface=interface)capture.sniff(timeout=10)# 分析抓取到的数据for packet in capture:print(packet)capture.close()if __name__ == '__main__':analyze_traffic('eth0')```在这个示例中,我们使用pyshark库来抓取接口'eth0'的网络流量。

流量统计 原理

流量统计 原理

流量统计原理
流量统计是指对网络流量进行监测、记录和分析的过程。

它通过收集和分析网络数据包来获取网络流量的相关信息,包括流量的源地址、目的地址、传输协议、端口号等。

流量统计的原理主要基于网络设备在数据传输过程中的操作。

网络设备如路由器、交换机、防火墙等会对数据包进行处理,包括转发、过滤、连接等操作。

在进行这些操作的同时,网络设备会记录下经过的数据包的相关信息,并根据这些信息生成流量统计报表或日志。

流量统计主要包括两个步骤:抓包和分析。

在抓包阶段,网络设备或者通过网络监测软件会截获经过设备的数据包,并将其相关的信息进行提取和记录。

在分析阶段,抓获的数据包被进一步处理和分析,用于生成统计数据以及实时监测网络流量的情况。

为了实现流量统计,通常会采用流量监测工具或软件。

这些工具能够收集数据包,并提供相应的分析和报表功能,帮助管理员了解网络的使用情况、流量分布和流量峰值等信息。

常见的流量统计软件有Wireshark、ntop、Microsoft Network Monitor 等。

流量统计在网络管理、网络优化和安全分析等方面具有重要作用。

通过对网络流量的监测和分析,管理员可以掌握网络的实际使用情况,优化网络资源的分配,发现网络安全问题等。

同时,流量统计还可以帮助企业评估网络容量,制定合理的网络
规划和扩展策略。

总之,流量统计是通过对网络数据包进行监测、记录和分析,以获取网络流量相关信息的过程。

它在网络管理、优化和安全方面有着重要的应用价值。

路由器设置流量统计功能

路由器设置流量统计功能

路由器设置流量统计功能现代社会的网络使用越发普及,路由器作为连接互联网的重要设备,承载着越来越多的网络流量。

为了更好地管理网络使用情况,提高用户体验,许多路由器都提供了流量统计功能。

本文将介绍如何设置路由器的流量统计功能。

一、了解流量统计功能的作用在设置路由器的流量统计功能之前,我们首先需要了解它的作用。

流量统计功能可以帮助我们了解网络的使用情况,包括上传和下载流量的数据量、连接设备的数量等。

通过分析统计数据,我们可以得知哪些设备或者应用程序占用了大量的网络资源,进而保持网络的稳定和流畅。

二、登录路由器管理界面设置路由器的流量统计功能需要登录路由器的管理界面。

首先,确保您已经连接上了路由器,并且路由器处于正常工作状态。

然后,打开您的浏览器,输入路由器的管理地址。

通常情况下,管理地址为192.168.1.1或者192.168.0.1,具体地址可以在路由器的说明书中找到。

输入管理地址后,按下回车键,即可进入路由器的管理界面。

三、找到流量统计功能设置选项在路由器的管理界面中,我们需要找到流量统计功能的设置选项。

不同品牌和型号的路由器界面略有不同,但一般都会有类似“高级设置”、“网络设置”或者“流量控制”等选项。

根据自己的路由器型号,逐一点击这些选项,寻找名称类似“流量统计”、“流量监控”等设置选项。

四、开启流量统计功能找到流量统计功能的设置选项后,点击进入相应的页面。

在流量统计页面中,您可以看到上传和下载的流量数据,以及连接设备的数量等信息。

一般情况下,流量统计功能已经默认开启,您只需要确认相关设置是否正确即可。

五、设置流量统计的时间段除了开启流量统计功能外,您还可以设置流量统计的时间段。

在流量统计页面中,找到“时间段设置”或者类似的选项,根据自己的需求进行设置。

您可以选择每天的哪个时间段进行流量统计,也可以设置统计周期为每周或每月。

六、保存并应用设置设置完流量统计功能及相关选项后,您需要点击页面上的“保存”或“应用”按钮,将设置保存并应用到路由器中。

网络IP的流量分析和流量优化

网络IP的流量分析和流量优化

网络IP的流量分析和流量优化随着互联网的快速发展,网络流量的管理和优化变得愈发重要。

了解和分析网络IP的流量情况,并针对性地进行优化,可以提高网络效率和用户体验。

本文将重点探讨网络IP的流量分析和流量优化的方法和技巧。

一、网络IP的流量分析在进行流量优化之前,首先需要对网络IP的流量进行分析,以了解网络的使用情况和问题所在。

以下是一些常用的网络IP流量分析方法:1.1 流量监控工具流量监控工具可以帮助管理员实时监控网络中各个IP地址的流量情况,并提供详细的统计报告和图表。

常见的流量监控工具有Wireshark、NetFlow Analyzer等。

1.2 流量统计通过对网络设备进行配置,可以获取关键的流量统计信息,如流量的协议分布、源IP和目的IP的流量排名等。

这些统计数据可以帮助管理员了解网络流量的分布情况和异常情况。

1.3 数据包分析通过对网络数据包进行深入的分析,可以获取更加详细的流量信息,如各个IP地址的通信模式、具体的通信内容等。

这种分析方法需要使用专业的网络数据包分析工具,如Tcpdump、Windump等。

二、网络IP流量优化在进行流量优化时,需要结合流量分析结果,有针对性地采取相应的优化措施。

以下是一些常用的网络IP流量优化方法:2.1 流量控制通过对网络设备进行流量控制的设置,可以限制某些IP地址的流量,防止其对网络带宽的滥用。

流量控制常用的方法有限速控制、带宽分配等。

2.2 流量调度对于网络中流量分布不均的情况,可以通过流量调度来优化网络的负载均衡,确保每个IP地址获得公平的网络带宽。

常见的流量调度技术有负载均衡、链路聚合等。

2.3 优化网络拓扑通过调整网络拓扑结构,可以减少网络中的瓶颈和延迟,提高网络的整体性能。

优化网络拓扑包括增加链路带宽、减小链路长度、增加网络节点等。

2.4 服务质量管理通过设置不同IP地址的服务质量(QoS)等级,可以优化网络中的优先服务和流量分配。

例如,对于重要的业务流量,可以设置较高的服务质量等级,确保其优先传输。

如何通过网络IP进行网站流量分析和统计

如何通过网络IP进行网站流量分析和统计

如何通过网络IP进行网站流量分析和统计在互联网时代,网站流量分析和统计是企业和个人网站管理员必不可少的工作之一。

通过了解网站的流量情况,可以了解访客的地域分布、流量来源、访问路径等重要信息,从而为网站优化和决策提供参考依据。

而网络IP是其中一种重要的数据来源,可以通过网络IP来进行网站流量分析和统计。

本文将介绍如何使用网络IP来进行网站流量分析和统计的方法。

一、获取网络IP数据要进行网站流量分析和统计,首先需要获取访客的网络IP数据。

获取网络IP数据的方法有多种,主要包括以下几种途径:1. 网站统计工具:许多网站统计工具提供了网络IP数据的获取和分析功能,如Google Analytics、百度统计等。

通过在网站上添加统计代码,这些工具可以自动收集网站访客的网络IP信息。

2. 服务器日志:服务器日志是记录网站访问情况的重要资源,其中包含了访客的网络IP信息。

通过分析服务器日志,可以获取访客的IP 数据。

常见的服务器日志分析工具有AWStats、Webalizer等。

3. 数据库记录:如果网站存在用户注册、登录或留言等功能,可以将用户的网络IP信息记录在数据库中,进而进行分析和统计。

二、IP地址解析与地理位置定位获取到网络IP数据后,首先需要将IP地址解析为实际的地理位置信息,以便进行后续的分析和统计。

IP地址解析主要包括两个步骤:1. IP地址转换:IP地址是由四个用英文句点分隔的数字组成,如192.168.0.1。

将IP地址转换成计算机能读取和处理的数据格式是IP地址解析的第一步。

2. 地理位置定位:通过IP地址解析服务提供商的API接口,将IP 地址转换为实际的地理位置信息,如国家、城市、省份等。

常用的IP 地址解析服务提供商有淘宝IP地址库、高德地图IP定位等。

三、网站流量分析和统计获取到网络IP数据并解析出地理位置信息后,可以进行网站流量分析和统计。

以下是一些常用的分析和统计指标:1. 地域分布:通过统计不同地理位置的访问量,了解访客所在的地域分布情况。

网络流量统计

网络流量统计

网络流量统计简介网络流量统计是指通过监控网络数据包的传输情况,对网络流量进行收集、分析和统计的过程。

网络流量统计可以帮助网络管理员了解网络的使用情况、检测异常情况、进行容量规划等。

本文将介绍网络流量统计的基本原理、常用工具以及如何使用这些工具来进行网络流量统计分析。

基本原理网络流量统计的基本原理是通过监控网络上的数据包来收集流量信息。

网络上的每个数据包都包含了源IP地址、目的IP地址、源端口号、目的端口号等重要信息。

通过对这些数据进行解析和分析,可以获取到每个数据包的流量大小、流量方向等信息。

网络流量统计的过程一般包括以下几个步骤:1.抓取数据包:使用抓包工具,如Wireshark、tcpdump等,来捕获网络上的数据包。

2.解析数据包:对抓取到的数据包进行解析,获取其中的源IP地址、目的IP地址、源端口号、目的端口号等信息。

3.统计流量:根据解析出来的信息,对数据包进行分类、计数,从而得到网络流量的统计结果。

常用工具WiresharkWireshark是一款开源的网络协议分析工具,可以用于抓取和分析网络数据包。

Wireshark支持多种网络协议解析,能够解析出数据包中的各种信息,包括源IP地址、目的IP地址、源端口号、目的端口号等。

使用Wireshark可以实时监控网络流量,并对流量进行详细的统计分析。

tcpdumptcpdump是一款基于命令行的网络数据抓取工具,可以用于捕获和解析网络数据包。

tcpdump支持多种抓包过滤条件,可以根据源IP地址、目的IP地址、端口号等信息进行过滤。

通过命令行参数的设置,可以将抓取到的数据包保存到文件中,以便后续的分析和统计。

ntopntop是一款用于网络流量监控和分析的工具,可以实时地收集和统计网络流量数据。

ntop提供了图形化的用户界面,可以直观地显示网络流量的情况,包括流量大小、流量方向、流量占比等。

ntop还支持导出统计结果到文件中,以便进行更详细的分析和报表生成。

IP包流量分析

实验4 IP包流量分析实验要求:(1)掌握IP数据报格式和报头各字段含义;(2)基于RAW Socket和wincap(或lipcap)实现IP数据包的捕获;(3)掌握分析与统计IP数据包信息的基本方法。

实验目的设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。

实验环境(设备)windows XPMicrosoft Visual C++6.0实验原理1、简介:网络层是TCP/IP协议参考模型中关键的部分。

IP协议把运输层送来的消息组装成IP数据包,并把IP数据包传递给数据链路层。

IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,用于消除通信子网间的差异,从而为信息发送方和接收方提供了透明的传输通道。

编制本程序前,首先要对IP包的格式有一定的了解。

IP数据包的第一个字段是版本字段(4位),表示所使用的IP协议的版本。

目前的版本是IPv4,版本,那么IPv6的版本字段自然就是值为6啦。

2.IP数据包的格式:如上图所示,下面解析一下IP数据包的各个字段的内容:①版本:占4位,指IP协议的版本。

通信双方使用的IP协议版本必须一致。

日前广泛使用的IP协议版本号为4 (即IPv4)。

IPv6 目前还处于起步阶段。

②首部长度:占4 位,可表示的最大十进制数值是15。

请注意,这个字段所表示数的单位是32位字( 1 个32位字长是4 字节),因此,当IP 的首部长度为1111 时(即十进制的15),首部长度就达到60字节。

当IP 分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。

因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。

首部长度限制为60字节的缺点是有时可能不够用。

这样做的目的是希望用户尽量减少开销。

最常用的首部长度就是20 字节(即首部长度为0101),这时不使用任何选项。

IP数据包流量统计

IP数据报流量统计学生姓名:指导老师:摘要本课程设计主要是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来。

程序中会用到Winpcap,它主要功能在于独立于主机协议发送和接收原始数据报。

本次课程设计中用VC++实现基于Winpcap的网络数据包的捕获和统计,基于Winpcap的应用程序将根据获取网络设备列表;选择网卡并打开;设置过滤器;捕获数据包或者发送数据包;列出网卡列表,让用户选择可用的网卡的步骤进行编写,同时对于TCP/IP协议以及IP数据抱的格式有了进一步的了解和掌握。

通过编写程序从而实现对网络中IP数据包流量的统计。

关键词IP数据包;流量统计;Winpcap;VC++1 引言随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和网络课程的学习是十分重要的,通过本次课程设计,有助于熟悉IP数据包格式并加深对IP协议的理解。

1.1 课程设计目的本次课程设计主要是通过用VC++编程实现对网络中IP数据包流量的统计,实际上是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,同时应用Winpcap,Winpcap提供了很好的捕获网络数据包的方法,通过本次课程设计可以将VC++知识与Winpcap结合起来实现在一段时间内对IP数据包的流量进行统计。

加深了对Winpcap的理解和运用能力,同时也增长了知识,开阔了视野,对于以后的学习有很大的帮助。

1.2 课程设计的要求(1)理解运用VC++软件实现对网络中的IP数据抱流量的统计方法和步骤。

(2)学会文献检索的基本方法和综合运用文献的能力。

(3)通过课程设计培养严谨的科学态度,认真的工作作风。

计算机网络课程设计报告-IP数据报流量统计

上是编制程序�监控网络�捕获一段时间内网络上的I P数据包�按I P数据包的本次课程设计主要是通过用V C++编程实现对网络中I P数据包流量的统计�实际1.1课程设计目的助于熟悉I P数据包格式并加深对I P协议的理解。

T C P/I P协议的主要内容和网络课程的学习是十分重要的�通过本次课程设计�有个重要基础�因此学习网络层以基本概念�了解I P协议的基本内容�对于掌握随着I n t e r n e t技术的发展�基于I P协议的应用成为网络技术研究与软件开发的一1引言传输�因此可能不按顺序到达目的地�或者出现重复。

I P协议以一种数据报的形式传输数据�每个数据报独立传输�可能通过不同路径I P协议向通信层隐藏了物理网络的差异。

I P协议是点对点的网络层通信协议。

I P协议是一种不可靠、无连接的数据报传送协议。

I P协议的特点如下�分为不同的类别。

根据流量设计程序的主要功能�相应的算法如下�调函数来显示网络流量了。

卡的数据包�包括不是发给本机的数据包�接下来的任务就是开始主循环调用回捕获网络数据流的某些数据�将网络适配器设置为统计模式就是接受所有经过网等�选择要监听的网络适配器就是要用户选择网卡�编译并设置过滤器是为了只图中取得网络适配器列表主要是得到网卡的相关信息�即网卡的个数、连接情况图1流量统计程序的主要功能根据以上设计原理可以得到流量统计程序的主要功能模块如下图1�}c o u t<<"N ode s c r i p t i o n a v a i l a b l e!"<<'\n';e l s ec o u t<<""<de s c r i p t i o n;i f(d->d e s c r i p t i o n)c o u t<<++i<<":"<n a m e;u_c h a r*p k t_d a t a)v o i d d i s p a t c h e r_h a n d l e r(u_c h a r*s t a t e,c o n s t s t r u c t p c a p_p k t h d r*h e a d e r,c o n s t //对于捕获到的每一个数据包应用此回调函数3.6回调函数的实现p c a p_c l o s e(f p);p c a p_l o o p(f p,0,d i s p a t c h e r_h a n d l e r,(P U C H A R)&s t_t s);进行处理�f p指向打开的网络适配器[4]//s t o r e c u r r e n t t i m e s t a m pp r i n t f("P P S=%I64u\n",P p s.Q u a d P a r t); p r i n t f("B P S=%I64u",B p s.Q u a d P a r t); //P r i n t t h e s a m p l e sp r i n t f("%s",t i m e s t r);//P r i n t t i m e s t a m p点击菜单栏里的工程——设置�选择连接第二步�把w i n p c a p开发包里面的l i b文件添加进去。

C语言下的网络流量分析系统设计与实现

C语言下的网络流量分析系统设计与实现一、引言随着互联网的快速发展,网络安全问题日益凸显,网络流量分析成为保障网络安全的重要手段之一。

本文将介绍在C语言环境下设计和实现网络流量分析系统的过程,包括系统的功能设计、实现思路以及关键技术点的讨论。

二、系统功能设计网络流量分析系统的主要功能包括数据包捕获、数据包解析、流量统计和报表生成等。

在C语言下设计这样一个系统,需要考虑如何高效地处理大量的数据包,并准确地进行流量分析。

1. 数据包捕获数据包捕获是网络流量分析系统的基础,可以利用libpcap等库函数来实现对网络接口的数据包捕获。

在C语言中,可以通过调用相关函数来打开网卡设备,并设置过滤规则以捕获特定类型的数据包。

2. 数据包解析数据包解析是对捕获到的数据包进行解析和提取有效信息的过程。

在C语言中,可以通过解析数据包头部信息来获取源IP地址、目标IP 地址、协议类型等关键信息,并将这些信息存储在内存中供后续处理。

3. 流量统计流量统计是对解析后的数据进行聚合和分析,以便生成统计报表。

在C语言中,可以使用哈希表等数据结构来记录不同IP地址或端口号的流量情况,并实时更新统计信息。

4. 报表生成报表生成是将统计结果以图表或表格的形式展示出来,帮助用户直观地了解网络流量情况。

在C语言中,可以使用第三方库如libchart等来生成各类报表,并将结果输出到文件或界面上。

三、实现思路在设计和实现网络流量分析系统时,需要遵循以下思路:1. 初始化环境首先需要初始化网络环境,打开网卡设备并设置过滤规则,以开始数据包捕获。

2. 数据包处理捕获到数据包后,对每个数据包进行解析和处理,提取关键信息并更新统计数据。

3. 统计分析根据解析后的数据进行流量统计和分析,生成相应报表并输出结果。

4. 结束清理在程序结束时,释放资源并关闭网卡设备,确保系统正常退出。

四、关键技术点讨论在C语言下设计网络流量分析系统时,有几个关键技术点需要重点讨论:1. 多线程处理为了提高系统性能,可以考虑使用多线程技术来并发处理数据包。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、题目及要求(一)题目:IP数据包流量统计(二)要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP 数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来(建议用图形表示出统计结果)。

用命令行运行:IPSta time logfile;其中IPSta是程序名,time是设定的统计时间间隔,logfil表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。

或在此基础上用图形化界面实现上述功能。

二、系统概要设计(一)流量统计主要功能模块图图中取得网络适配器列表主要是得到网卡的相关信息,即网卡的个数、连接情况等,选择要监听的网络适配器就是要用户选择网卡,编译并设置过滤器是为了只捕获网络数据流的某些数据,将网络适配器设置为统计模式就是接受所有经过网卡的数据包,包括不是发给本机的数据包,接下来的任务就是开始主循环调用回调函数来显示网络流量了。

(二)程序流程图图中获取网卡列表是为了得到网卡的相关信息,以便于用户进行选择,选取Ethermet网卡是用户所选择的网卡类型,编译设置过滤器是为了编译并设置过滤器是为了只捕获网络数据流的某些数据,打开网卡既将网卡设置为混杂(统计)模式是为了接受所有经过网卡的数据包,包括不是发给本机的数据包,开始主循环以是否超时为判断条件,循环体内主要有捕获IP数据包、将IP包的源地址加入链表、条件判断,循环结束后输出链表内容,程序至此结束。

三、系统详细设计1. 取得网络适配器列表//取得网络适配器列表步骤中,alldevs是pcap_if_it指针,指向链表头,errbuf 是char类型数组,存储错误信息[3]。

pcap_findalldevs(&alldevs,errbuf);cout<<”网络适配器列表:”<<’\n’;for(d=alldevs;d;d=d->next){cout<<++i<<":"<<d->name;if (d->description)cout<<""<<d->description;elsecout<<"No description available!"<<'\n';}2. 指定要监听的网络适配器并打开cout<<”输入要监听的网络适配器号:”<<I;cin>>inum;for(d=alldevs,i=0;i<inum-1;d=d->next,i++);fp=pcap_open_live(d->name,65536,1,1000,errbuf);3. 编译并设置过滤器//编译过滤器,fp指向打开的网络适配器,fcode为编译完成后的过滤器存储地址,“tcp“给出了过滤条件,下一个参数表示是否被优化(0为false,1为true),最后一个参数给出了子网掩码。

pcap_compile(fp,&fcode,”tcp”,1,netmask)pcap_setfilter(fp,&fcode)4.设置网络适配器为统计模式if(pcap_setmode(fp,MODE_STAT)<0){cout<<”\n设置网络适配器模式错误!\n”;pcap_close(fp);}5.开始主循环,调用回调函数显示网络流量统计信息//pcap_loop由Winpcap库定义,对每个采集来的数据包都用ProcessPacket 函数进行处理,fp指向打开的网络适配器[4]pcap_loop(fp,0,dispatcher_handler,(PUCHAR)&st_ts);pcap_close(fp);6.回调函数的实现//对于捕获到的每一个数据包应用此回调函数voiddispatcher_handler(u_char *state,conststructpcap_pkthdr *header,constu_char *pkt_data){structtimeval *old_ts=(structtimeval *)state;u_int delay;LARGE_INTEGER Bps,Pps;struct tm *ltime;chartimestr[16];time_tlocal_tv_sec;//计算距上一个数据包的时间延迟,以ms为单位//这个值是从与一个数据包相关的时间戳中截获的delay=(header->_sec-old_ts->tv_sec)*1000000-old_ts->tv_usec+header->ts.t v_usec;//获得每秒的比特数Bps.QuadPart=(((*(LONGLONG*)(pkt_data+8))*8*1000000)/(delay));//获得每秒的数据包数Pps.QuadPart=(((*(LONGLONG*)(pkt_data))*1000000)/(delay));//将时间戳转变位可读的标准格式ltime=localtime(&header->_sec);strftime(timestr,sizeoftimestr,"%H:%M:%S",ltime);//Print timestampprintf("%s",timestr);//Print the samplesprintf("BPS=%I64u",Bps.QuadPart);printf("PPS=%I64u\n",Pps.QuadPart);//store current timestampold_ts->tv_sec=header->_sec;old_ts->tv_usec=header->_usec;运行结果:四、课程设计总结这次的课程设计也使我意识到了理论与实践相结合的重要作用,学习到知识应该应用到实践中。

在此次的课程设计过程中,熟悉IP包格式和加深对IP协议的理解,告诉我们要不断地学习网络方面的知识,精益求精,我们应不断地提高自己的水平,在每次的编程中能够有所领悟,让自己在程序的编译和应用上可以有更大一步的提高。

更好的学习计算机网络和其他方便的有关知识,做到精益求精。

指导教师评语:成绩:指导教师:年月日附录一:程序代码// NodeList.h: interface for the CNodeList class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_NODELIST_H__9781C411_82DF_47F7_A449_3054B18A550E_ _INCLUDED_)#defineAFX_NODELIST_H__9781C411_82DF_47F7_A449_3054B18A550E__INCLUDE D_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include<iostream>#include<fstream>#include<iomanip>#include<winsock2.h>#include "IPNode.h"using namespace std;// 结点链表类CNodeListclassCNodeList{private:CIPNode * pHead; // 链表头CIPNode * pTail; // 链表尾public:// Default constructorCNodeList();// Default destructorvirtual ~CNodeList();// 把新捕获的IP数据包加入链表voidaddNode(unsigned long, unsigned long, unsigned char);// 输出链表ostream& print(ostream&);};#endif// !defined(AFX_NODELIST_H__9781C411_82DF_47F7_A449_3054B18A550E__I NCLUDED_)// IPNode.h: interface for the CIPNode class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_IPNODE_H__1366A568_424A_4BDF_8E76_9AF5BA10D449__ INCLUDED_)#defineAFX_IPNODE_H__1366A568_424A_4BDF_8E76_9AF5BA10D449__INCLUDED _#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// 结点类CIPNodeclassCIPNode{private:unsigned long m_dwSourIPAddr; // 源IP地址unsigned long m_dwDestIPAddr; // 目的IP地址unsigned char m_chProtocol; // IP包的协议类型unsigned long m_dwCouter; // 数据包的数量public:CIPNode * pNext; // 指向下一类IP结点CIPNode();virtual ~CIPNode();// 构造函数CIPNode(unsigned long, unsigned long, unsigned char);// 增加数据包的数量voidaddCount();// 取得数据包数量unsigned long getCount();// 取得源IP地址unsigned long getSourIPAddr();// 取得目的IP地址unsigned long getDestIPAddr();// 取得协议类型unsigned char getProtocol();// 取得协议名称(TCP,UDP,ICMP...)char * getProtocol_String();};#endif// !defined(AFX_IPNODE_H__1366A568_424A_4BDF_8E76_9AF5BA10D449__I NCLUDED_)#include<iostream>#include<fstream>#include<winsock2.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>using namespace std;#include "IPNode.h"#include "NodeList.h"#pragma comment(lib, "Ws2_32.lib")// 定义IP头部typedefstructIPHeader{unsigned char Version_HeaderLength; // 版本(4位)+首部长度(4位) unsigned char TypeOfService; // 服务类型unsigned short TotalLength; // 总长度unsigned short Identification; // 标识unsigned short Flags_FragmentOffset; // 标志(3位)+分片偏移(13位) unsigned char TimeToLive; // 生存时间unsigned char Protocal; // 协议unsigned short HeaderChecksum; // 首部校验和unsigned long SourceAddress; // 源IP地址unsigned long DestAddress; // 目的IP地址}IPHEADER;#include "IPMonitor.h"#define BURRER_SIZE 65535void main(intargc,char * argv[]){// 判断输入的命令行格式是否正确if (argc != 2){cout<< "请按以下格式输入命令行: IPMonitorduration_time"<<endl<< " 其中duration_time为监控时间, 单位为秒"<<endl;return;}WSADATA wsData;// 初始化Winsock DLLif (WSAStartup(MAKEWORD(2,2),&wsData) != 0){cout<< "WSAstartup failed!" <<endl;return;}// 创建Raw SocketSOCKET sock;if ( (sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED))== INV ALID_SOCKET ){cout<< "Create socket failed!" <<endl;return;}// 设置IP头操作选项,表示用户可以亲自对IP头进行处理BOOL bFlag = TRUE;if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&bFlag, sizeof(bFlag)) == SOCKET_ERROR){cout<< "Setsockopt failed!" <<endl;return;// 获取本地主机名charpHostName[128];if (gethostname(pHostName, 100) == SOCKET_ERROR){cout<< "Gethostname failed!" <<endl;return;}// 通过本地主机名获取本地IP地址hostent * pHostIP;if((pHostIP = gethostbyname(pHostName)) == NULL){cout<<"Gethostbyname failed!"<<endl;return;}// 填充sockaddr_in结构sockaddr_inaddr_in;addr_in.sin_addr = *(in_addr *)pHostIP->h_addr_list[0]; // 设定IP地址addr_in.sin_family = AF_INET; // 设定地址类型addr_in.sin_port = htons(8000); // 设定端口// 把原始套接字绑定到本机地址上if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in)) == SOCKET_ERROR) {cout<< "Bind failed!" <<endl;return;}// 把网卡设置为混杂模式,以便接收所有的IP包#define IO_RCV ALL _WSAIOW(IOC_VENDOR,1)unsigned long pBufferLen[10];unsigned long dwBufferInLen = 1;unsigned long dwBytesReturned = 0;if ((WSAIoctl(sock, IO_RCV ALL, &dwBufferInLen, sizeof(dwBufferInLen), &pBufferLen,sizeof(pBufferLen), &dwBytesReturned, NULL, NULL)) == SOCKET_ERROR){cout<<"Ioctlsocket failed!"<<endl;return;// 把socket设置为非阻塞模式unsigned long dwTemp = 1;ioctlsocket(sock, FIONBIO, &dwTemp);// 设置接收缓冲区charpBuffer[BURRER_SIZE];// 定义存放IP数据包的链表CNodeListIpList;double dwDuration = atof(argv[1]); // 输入参数为捕获时间time_t beg;time_t end;time(&beg); // 获得当前系统时间// 输出本地IP地址cout<<endl;cout<< "本机IP:"<<inet_ntoa(*(in_addr *)&(addr_in.sin_addr.S_un.S_addr)) <<endl<<endl;cout<< "开始捕获..." <<endl<<endl;while (1){time(&end); // 获得当前系统时间//如果捕获时间到,就结束捕获if (end-beg >= dwDuration){break;}// 捕获经过网卡的IP数据包intnPacketSize = recv(sock,pBuffer,BURRER_SIZE,0);if (nPacketSize> 0){IPHEADER * pIpHdr;// 通过指针把缓冲区中的内容强制转换为IPHEADER数据结构pIpHdr = (IPHEADER *)pBuffer;// 判断IP包的源IP地址或目的IP地址是否为本地主机的IP地址if (pIpHdr->SourceAddress == addr_in.sin_addr.S_un.S_addr|| pIpHdr->DestAddress == addr_in.sin_addr.S_un.S_addr){// 如果源IP地址或目的IP地址是本机IP,则将该IP数据包加IpList.addNode(pIpHdr->SourceAddress, pIpHdr->DestAddress, pIpHdr->Protocal);}}}// 输出统计结果cout<< "IP数据包统计结果: (" <<dwDuration<< " 秒)"<<endl<<endl;IpList.print(cout);cout<<endl;return;}。

相关文档
最新文档