为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

计算机网络连接监控系统

2017-09-26 50页 doc 246KB 19阅读

用户头像

is_531654

暂无简介

举报
计算机网络连接监控系统计算机网络连接监控系统 毕业设计(论文)任务书 姓 名 题 目 计算机网络连接监控系统 1. 了解网络编程方面的知识,能使用Visual Basic进行网设 络编程。 计 2. 查阅与课题有关的中外文文献,完成外文文献翻译任 务。 任 3. 编程实现对本机与远程计算机的网络连接情况的监 控。 务 4. 有完整的实现程序。 1. 1.2.21,3.5查阅与课题有关的中外文文献,完成外文时 文献翻译任务。 2. 2.3.6,3.25掌握Visual Basic网络编程的方法。 间 3. 3.3.26,4.10设计...
计算机网络连接监控系统
计算机网络连接监控系统 毕业设计(论文)任务书 姓 名 目 计算机网络连接监控系统 1. 了解网络编程方面的知识,能使用Visual Basic进行网设 络编程。 计 2. 查阅与课题有关的中外文文献,完成外文文献翻译任 务。 任 3. 编程实现对本机与远程计算机的网络连接情况的监 控。 务 4. 有完整的实现程序。 1. 1.2.21,3.5查阅与课题有关的中外文文献,完成外文时 文献翻译任务。 2. 2.3.6,3.25掌握Visual Basic网络编程的方法。 间 3. 3.3.26,4.10设计出程序实现方案。 4. 4.4.11,5.31完成网络监控系统。 进 5. 5.6.1,6.15撰写毕业设计论文,参加答辩。 度 原 要 1. 刘宏.网络监控系统。计算技术与自动化 17(3)2. 始 参 2. 王晓慧.计算机网络监控系统的应用与发展.民航经济资 考 与技术 料 文 和 献 主 系主任 指导教师 毕业设计(论文)评审表(一) 学专班姓名 号 业 级 题计算机网络连接监控系统 目 指 导 教 师 评 语 成绩(百分制): 指导教师签名: 年 月 日 评 阅 教 师 评 成绩(百分制): 评阅教师签名: 年 月 语 日 毕业设计(论文)评审表(二) 学专班姓名 号 业 级 答 辩 资 格 专业答辩委员会主任签字: 审 年 月 日 查 专 业 答 辩 委 员 会 评 语 答辩成绩(百分制): 专业答辩委员会主任签字: 总评成绩: 年 月 日 1 计算机网络连接监控系统 学 生: 指导教师:孙红艳 摘 要:近几年来,计算机网络系统的发展相当迅猛,计算机网络系统已成为人们日常工作和生活中不可缺少的重要的部分。为了保证计算机网络系统安全可靠工作,对计算机网络系统进行自动监视和有机管理是极其必要的。 本文利用Windows API函数实现了一种计算机网络连接监控系统。系统分为三个主要部分:IP监控、网络流量、IP统计情况。IP监控模块对本地、远程IP及所使用端口进行监控,从而发现可疑的连接,通过调用iplpapi.dll库中的GetTcpTable()函数实现;网络流量模块可以查看到当前的发送,接收速度和累计的流量信息,通过调用“IP助手库函数”中GetIfTable()函数实现。IP协议统计情况模块可以获得TCP,IP,UDP,ICMP的统计情况,通过调用使用“IP助手库函数”的GetIpStatistics()函数、GetIcmpStatistics()函数、GetTcpStatistics()函数以及GetUdpStatistics()函数实现。 本文对于该系统的设计过程进行了详尽的介绍,并且分析和比较该系统各功能模块和总体性能,对其中涉及的技术问题提出了编程思路和解决方法。 关键词:网络监控,IP监视,网络流量,信息统计, Windows API I Abstract:In the last few years, with the development of the network system, the network system has become an important part in daily lives. It is necessary to monitor network in order to ensure the network working safely and credible. This thesis carried out a system of monitoring network using window API. The system can be divided into three parts: IP supervision, Network discharge and IP agreement .The IP supervision module can monitor local and remote IP, and its usage port, then the suspicious connection can be detected. This function can be realized through making use of GetTcpTable() in ” iplapapi.dll” database. Network discharge module can examine the amount of information which is sending or receiving, it can be realized through making use of GetIfTable() in " IP assistant ". The third module can be realized through making use of other functions in "IP assistant”. This thesis introduces the process of designing, and put forward the programming method and solving method through analyzing and comparing the function of these modules. Keywords: Network supervision, IP surveillance, Network discharge, Information statistics, Windows API II 目 录 引 言 ..................................................................................................... 1 第1章 概述 ......................................................................................... 21.1 网络监控系统 .............................................................................. 2 1.2 网络监控系统的应用 .................................................................. 3 1.3 本文所做工作 .............................................................................. 3 第2章 网络协议及API函数介绍 ....................................................... 4 2.1简介INTERNET与TCP/IP协议 .................................................... 4 2.1.1 Internet基础 .......................................................................... 4 2.1.2 TCP/IP协议 ........................................................................... 5 2.2. ICMP协议 .................................................................................. 8 2.3 API介绍及调用 ........................................................................... 9 2.3.1 API分类 .............................................................................. 10 2.3.2 API介绍及应用 ................................................................ 10 第3章 设计方案与功能介绍 ............................................................ 12 3.1 总体设计 ................................................................................... 12 3.2 各模块设计及说明 .................................................................... 13 第4章 各功能模块的具体实现......................................................... 17 4.1 监视IP模块 .............................................................................. 17 4.2查看流量模块 ............................................................................ 19 4.3 IP协议统计情况模块 ................................................................ 20 第5章 程序运行分析 ........................................................................ 25 5.1 功能选择界面 ............................................................................ 25 5.2 IP监视界面运行结果分析 ......................................................... 25 5.3 查看流量界面运行结果分析 ..................................................... 26 5.4 IP协议统计情况界面运行结果分析 ......................................... 27 第6章 结论 ....................................................................................... 28 致 谢 ................................................................................................... 29 附 录:计算机网络连接监控系统程序代码 ..................................... 30 参 考 文 献 ....................................................................................... 76 III 引 言 为了保证计算机网络系统安全可靠工作,对计算机网络系统进行自动监视和有机管理是极其必要的。网络监控就是对网络内到达本地服务器的所有数据包进行截取和分析,掌握当前网络总流量,同时可以根据不同的需要对特定端口或特定外部地址进行监视,防止非法入侵,以保障本地网络系统的安全和稳定。它的主要意义在于实现了网络监控。随着内部网络的规模与容量的日渐扩大,保持系统的正常运作将会变得越来越重要。网络监控能使系统及时地发现网络流量异常的现象,使服务器在发现非法入侵后能立即做出反应,来保护自己的服务器不被破坏,以求获得安全性的同时,提高网络性能。 1 第1章 概述 近几年来,由于互联网络的发展,整个世界经济正在迅速地融为一体,而整个国家犹如一部巨大的网络机器。计算机网络已经成为国家的经济基础和命脉。计算机网络在经济和生活的各个领域正在迅速普及,一句话,整个社会对网络的依赖程度越来越大。众多的企业、各种组织、政府部门与机构都在组建和发展自己的网络,并连接到Internet上,以充分利用网络的信息和资源。网络已经成为社会和经济发展强大动力,其地位越来越重要。伴随着网络的发展,带来了很多的问题,其中安全问题尤为突出。 1.1 网络监控系统 为了保证计算机网络系统安全可靠工作,对计算机网络系统进行自动监视和有机管理是极其必要的。网络监控就是对网络内到达本地服务器的所有数据包进行截取和分析,掌握当前网络总流量,同时可以根据不同的需要对特定端口或特定外部地址进行监视,防止非法入侵,以保障本地网络系统的安全和稳定。它的主要意义在于实现了网络监控。随着内部网络的规模与容量的日渐扩大,保持系统的正常运作将会变得越来越重要。网络监控能使系统及时地发现网络流量异常的现象,使服务器在发现非法入侵后能立即做出反应,来保护自己的服务器不被破坏,以求获得安全性的同时,提高网络性能。 现在国际上比较有名的入侵检测系统有ISS公司的RealSecure、Enterasys公司的 Dragon等。他们将基于主机和基于网络的入侵检测技术基础集成在一起,扩大了检测的数据源,降低了漏报率,并且对于检测针对主机的攻击效果比较好。但是这种方法的实施难度特别大,还要考虑到网络中不同计算机操作系统的差异,需要将数据格式进行转换,以达到统一。这些产品系统性能相对比较稳定,特征知识库更新速度比较快。国内公司生产的入侵检测系统也比较多,如上海 2 复旦光华信息股份有限公司的光华S-Audit网络入侵检测与安全审计系统V3.0、常州远东科技有限公司的“黑客煞星”、长沙天一银河信息产业有限公司的天一猎鹰入侵检测系统(V1.0)、上海三零卫士信息安全有限公司的鹰眼网络安全监测仪、上海金诺网安的KIDS Ver3.0等。它们的体系结构大同小异,性能相差不大,都能检测到以下一些攻击事件,如多数的扫描、嗅探、后门、病毒、拒绝服务、分布式拒绝服务、非授权访问、欺骗等。由于它们大多是以误用检测的分析方法为主,因此有的漏报率相对高一些,特征知识库更新速度相对也要慢一些。 1.2 网络监控系统的应用 网络监控系统能应用在各个领域。例如,在网吧里,网管能利用该系统对上网者进行监控,知道上网者浏览过的网站或网页。在公安部门,网络警察利用网络监控系统对整个网络进行实时监控,追踪企图利用网络进行非法活动的罪犯。在军队里,可以利用该系统进行电子战,能够及时发现敌方的准确位置。 1.3 本文所做工作 本次毕业设计主要实现了一个小型的网络监控系统,该系统由三部分组成:IP监视;网络流量监控;IP协议统计情况。 论文组织如下:第一章为引言部分;第二章介绍网络监控的基本原理;第三章是网络监控系统的设计方案和功能介绍;第四章是各功能模块的具体实现;第五章是程序运行分析;最后是结论和致谢。 3 第2章 网络协议及API函数介绍 实现网络监控,必须掌握Internet和网络协议的基础知识。本系统用VB作为开发工具,Visual Basic 不仅仅是一个编译器,它是一个全面的应用程序开发环境。使用Visual Basic语言进行程序设计,虽然可以使用其本身所提供的各个控件、函数、语句等来完成你所需要的功能。但是在系统操作、应用、控制方面,简单地使用这些基本功能是不足以达到需求的。因此可以使用Windows API来完成所需要的功能。 2.1简介Internet与TCP/IP协议 2.1.1 Internet基础 Internet的中文译名为“因特网”或“国际互联网”。值得注意的是,Internet与internet是不同的两个概念。Internet专指全球最大的、开放的、使用TCP/IP协议的、由众多网络互联而成的网络集合体。而internet是interconnect network的缩写,是泛指性的“互联网”。 灵活多样的入网方式是Internet获得高速发展的重要原因,任何计算机只要采用TCP/IP协议与Internet中的任何一台主机通信就可以成为Internet的一部分。Internet所采用的TCP/IP协议族成功地解决了不同硬件平台、不同网络产品和不同操作系统之间的兼容性问题,标志着网络技术的一个重大进步。因此,无论是大型主机、小型机,还是微机或工作站都可以运行TCP/IP协议并与Internet进行通信,目前TCP/IP已经成为事实上的国际标准。 Internet采用了目前在分布式网络中最为流行的客户/服务程序(Client/Server)模式,大大增加了网络信息服务的灵活性。用户可通过安装在自己主机上的客户程序发出请求,与装有相应服务程序的主机进行通信。凡是装有服务程序的主机均可对其他主机提供信 4 息服务。当自己的主机没有所需要的客户程序时,可以通过远程登录(TELNET)连接到公共客户程序,然后再向装有服务程序的主机发出服务请求。 Internet把网络技术、多媒体技术和超文本技术融为一体,体现了当代多种信息技术互相融合的发展趋势。丰富的信息服务功能和友好的用户接口使Internet可以做到雅俗共赏。除了TCP/IP协议所提供的应用程序外,还有许多高级的信息服务方式和友好的用户接口,如Gopher, Archie、WAIS和WWW等。这种强大的网络信息服务手段是其他网络难以比拟的。 作为一个互联网络,归结起来,Internet具有以下的特点: 对用户隐蔽互联网络的底层结构。这意味着Internet用户和应用程序不必了解硬件连接的细节; 能通过(与通信的双方计算机之一或两者无直接物理连接的)中间网络收发数据; Internet上的所有计算机共享一个全局的机器标识符(名字或地址)集合; 用户界面独立于网络,即建立通信和传送数据的一系列操作与低层网络技术和通信的计算机无关。 以上的四点实际上就是一个通用服务的概念,因此Internet就是一个通用服务。 2.1.2 TCP/IP协议 TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网间网协议)是目前世界上应用最为广泛的协议,它的流行与Internet的迅猛发展密切相关—TCP/IP最初是为互联网的原型ARPANET所设计的,目的是提供一整套方便实用、能应用于多种网络上的协议,事实证明TCP/IP做到了这一点,它使网络互联变得容易起来,并且使越来越多的网络加入其中,成为Internet的事实标准。 TCP/IP协议是一组不同层次上的多个协议的组合。TCP/IP通常 5 被认为是一个四层协议系统,每一层负责不同的功能: 1. 应用层:所有用户所面向的应用程序的统称。TCP/IP协议族在这一层面有着很多协议来支持不同的应用,许多大家所熟悉的基于Internet的应用的实现就离不开这些协议。如我们进行万维网(WWW)访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析用DNS协议、 远程登录用Telnet协议等等,都是属于TCP/IP应用层的;就用户而言,看到的是由一个个软件所构筑的大多为图形化的操作界面,而实际后台运行的便是上述协议。 应用层的每种服务都有一个唯一的端口号,例如Telnet的端口号为23。当TCP或UDP由IP收到数据后,会根据标头的端口号将数据转交给对应的程序处理。需要注意的是,TCP和UDP的应用程序可分配相同的端口号,必须配合端口号和传输协议种类才可以决定数据对应的程序。 ? 知名的端口号: FTELNET SMTP DNS TFSNMNAM TP TP P E 21 23 25 53 69 161 42 端口号0到255已经保留给著名的服务,256到1023则分配给UNIX特有的服务。 2. 传输层:这一层的的功能主要是提供应用程序间的通信,TCP/IP协议族在这一层的协议有TCP和UDP。 (1) TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有:Telnet、FTP、SMTP等。 6 (2) UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。 3. 网络层: TCP/IP协议族中非常关键的一层,主要定义了IP地址格式,从而能够使得不同应用类型的数据在Internet上畅通地传输,IP协议就是一个网络层协议。 4. 链路层,这是TCP/IP软件的最低层,负责接收IP数据包并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。 TCP/IP协议族提供网间连接的完善功能, 包括IP数据报规定互连网络范围内的IP地址格式。 Internet 上,为了实现连接到互联网上的结点之间的通信,必须为每个结点(入网的计算机)分配一个地址,并且应当保证这个地址是全网唯一的,这便是IP地址。 目前的IP地址由32个二进制位表示,每8位二进制数为一个整数,中间由小数点间隔,如159.226.41.98,整个IP地址空间有4组8位二进制数,由表示主机所在的网络的地址以及主机在该网络中的标识共同组成。 为了便于寻址和层次化的构造网络,IP地址被分为A、B、C、D、E五类,商业应用中只用到A、B、C三类。 7 地址引导位 网络位 地址结构 主机位可类型 网络位 地址范围 用 地址数 0 1--126 16777214 A类 网+主+主+ 主 10 128--191 65534 B类 网+网+主+ 主 110 192--223 254 C类 网+网+网+ 主 1110 224--239 D类 组播地址 1111 240-- E类 研究用地址 2.2. ICMP协议 Internet 控制信息协议(ICMP)是IP组的一个整合部分。通过IP包传送的ICMP信息主要用于涉及网络操作或错误操作的不可达信息。 ICMP 包发送是不可靠的,所以主机不能依靠接收 ICMP 包解决任何网络问题。ICMP的主要功能如下: 通告网络错误。比如,某台主机或整个网络由于某些故障不可达。如果有指向某个端口号的TCP或UDP包没有指明接受端,这也由ICMP报告。 通告网络拥塞。当路由器缓存太多包,由于传输速度无法达到它们的接收速度,将会生成“ICMP 源结束”信息。对于发送者,这些信息将会导致传输速度降低。当然,更多的ICMP 源结束信息的生成也将引起更多的网络拥塞,所以使用起来较为保守。 协助解决故障。ICMP支持Echo功能,即在两个主机间一个往返路径上发送一个包。Ping是一种基于这种特性的通用网络管理工 8 具,它将传输一系列的包,测量平均往返次数并计算丢失百分比。 通告超时。如果一个IP包的TTL降低到零,路由器就会丢弃此包,这时会生成一个ICMP包通告这一事实。 TraceRoute是一个工具,它通过发送小TTL值的包及监视ICMP超时通告可以显示网络路由。 ? 协议结构: 8 16 32bit Type Code Checksum Identifier Sequence number Address mask ? Type ― 错误消息或信息消息。错误消息可能是不可获得目标文 件,数据包太大,超时,参数问题等。可能的信息消息有:Echo Request、Echo Reply、Group Membership Query、Group Membership Report、Group Membership Reduction。 ? Code ― 每种消息类型具有多种不同代码。不可获得目标文件正 式这样一个例子,即其中可能的消息是:目标文件没有路由,禁 止与目标文件的通信,非邻居,不可获得地址,不可获得端口。 具体细节请参照相关标准。 ? Checksum ― 计算校验和时,Checksum 字段设置为0。 ? Identifier ― 帮助匹配 Requests/Replies 的标识符,值可能为0。 ? Sequence Number ― 帮助匹配 Requests/Replies 的序列号,值可能为0。 ? Address Mask ― 32位掩码地址 2.3 API介绍及调用 Windows 这个多作业系统除了协调应用程式的执行、分配内 9 存、管理系统资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备„„等目的,由于这些函数服务的对象是应用程式(Application), 所以便称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口。 2.3.1 API分类 凡是在 Windows 工作环境底下执行的应用程式, 都可以调用Windows API。按照通常的划分标准,Windows API函数分为七大类: 1、 窗口管理类:这类API函数向应用程序提供了一些创建和管理用户界面的方法,我们可以使用它们来做出程序的界面。 2、 窗口通用控制类:系统SHELL提供了一些控制,使用这些控制可以使窗口具有与众不同的外观,通用控制是由通用控制库COMCTL32.DLL提供的。 3、 SHELL特性类:应用程序可以使用它们来增强系统SHELL各方面的功能。 4、 图形设备接口(GDI):提供绘图、图形处理、使用显示设备等一系列的API函数。 5、 系统服务类:为计算机提供了访问计算机资源以及底层操作的手段。 6、 国际特性类:有助于我们编写国际化的应用程序,提供Unicode字符集和多语种支持。 7、 网络服务类:允许网络上的不同计算机之间的不同应用程序之间进行通讯,用于在各计算机上创建和管理共享资源的连接。 2.3.2 API介绍及应用 API说到底就是一系列的底层函数,是系统提供给用户用于进入操作系统核心,进行高级编程的途径。通过在Visual Basic应用程 10 序中声明外部过程就能够访问Windows API(以及其它的外部DLLs)。在声明了过程之后,调用它的方法与调用Visual Basic自己的过程相同。要声明一个DLL过程,需要在代码窗口的“声明”部分增加一个Declare语句,如果该过程返回一个值,应将其声明为Function。例如: Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type 如果过程没有返回值,可将其声明为Sub。 缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。在其他类型的模块中定义的DLL过程是模块私有的,必须在它们前面 加上Private关键字,以示区分。特别值得注意的是,在32位的Visual Basic中过程名是区分大小写的。 Declare语句中的Lib子句用来告诉Visual Basic如何找到包含该过程的dll文件。如果引用的过程属于Windows核心库(User32、Kernel32或 GDI32),则可以不包含文件扩展名。 VB6专业版在VB目录的Winapi子目录下,用几个文件提供了关于API的信息。Win32api.txt文件中包含了32位Windows API函数中用到的函数和类型的结构声明以及全局常量的值。用户可以用VB本身带的外接程序“API浏览器”来方便地使用Win32api(Txt,如下所示: 点击菜单文件项的“加载文本文件„”从VB目 录下的WINAPI目录中选择“WIN32API.TXT”,就可以看WINDOWS 95系统的API函数的声明、常数定义和数据类型了。例如,我们打算查看函数InverRect()的声明。首先,点击“搜索”按钮,输入字符串 “InverRect"。在“可选项”栏中,兰色的亮度条将移 动到“InverRect”项上。再点按“添加”按钮,在“选定项”中就出现“InverRect:”在Visual Basic中的 声明了。接下来自然是点按“复制”按钮,然后将窗 口切换到Visual Basic开发环境中,在需要声明API 函数的地方Ctrl,V(粘贴)即可。 11 第3章 设计方案与功能介绍 3.1 总体设计 网络监控系统主要功能是监视连接到本机的所有远程计算机,向用户显示进出流量、进出IP和端口、应用程序、访问动作以及备注的一些附加信息。 为了使本系统结构清晰,便于调试,易于实现,将整个系统按功能划分为两个主要功能模块,在每个主要功能模块内部又按功能细划分为若干个子功能模块,然后按“自顶向下、逐步求精”的方法逐一实现,完成全部设计。 网络监控系统总体划分为三大功能分别是: (1) 监视IP功能:监听到达本地服务器的外部地址和所使用的端口,能及时发现可疑的IP地址。 (2) 查看网络流量功能:对本机流入和流出的数据量进行实时的监控,并统计总的流进,流出量。 (3) IP协议统计情况功能:在本地计算机上对IP协议统计情况行管理和查询。 系统的主流程框图如图所示 12 开始 欢迎界面 功能选择 监视IP 查看流量 IP协议统计情况 结束 1. 监视IP: 监听到达本地服务器的外部地址和所使用的端口 能及时发现可疑的 IP地址。 2. 查看流量: 对本机流入和流出的数据量进行实时的监 控,并统计总的流进,流出量。 3. IP协议统计情况: 对本机的IP协议统计情况进行查询和管理。 3.2 各模块设计及说明 ? 监视IP 设计流程图: 13 开始 N 设备是否使用TCP协 议(Lngrequired>0) Y 调用inet_ntoa函数接收Internet地址 将数据送到缓冲区 将缓冲区中开始的四个字节数据进行处理 调用ntohs函数转换字节顺序 显示建立连接本地端口与远程端口 调用lstrcpyA将变量内容转换为字符串 显示本地IP和远程IP 显示TCP各种状态 结 束 说明: 此模块主要实现监听到达本地服务器的外部地址和所使用的 端口。 14 在获取远程计算机IP地址前,先确定设备是否使用的是TCP通信协议。处理接收到的各种TCP信息,并显示出来。调用iplpapi.dll库中的GetTcpTable ()函数,它的作用是返回当前系统中全部有效的TCP连接,GetTcpTable()函数取回的信息是以一个MIB_TCPROW结构的数组出现的,这个结构中的包含着主机IP地址的成员,用长整型的数据形式存储着一个地址,这个地址的每一部分是存储在四个字节长整型值中的一个字节中。 ? 查看流量 设计流程图: 开 始 调用IP助手函数库 有关吞吐量的函数GetIfTable 函数指向的缓冲区结构 收到的字节数 发送的字节数 结束 说明:此模块实现了对本机流入和流出的数据量进行实时的监控。 使用“IP助手库函数”(iphlpapi.dll)获取网络流量: “IP助手库函数”中有关吞吐量的函数GetIfTable可获取当前所有的网络连接情况,其中包括使用网卡的局域网连接,以及使用ISDN或调制解调器的拨号网络连接。可获取的信息包括:连接速 15 度、界面类型、操作状态、当前总共收到和发送的字节数,等等。 其中“总共收到和发送的字节数”等信息完全是累计的。也就是说,这些信息不受网络连接断开的影响(如拨号网络),能完整各网络全天的吞吐总量。 ? IP协议统计情况 TCP信息统计 信IP信息统计 息 统 计 UDP信息统计 ICMP信息统计 说明:此模块主要实现的是可在自己的计算机上对IP协议统计情况行管理和查询。 使用“IP助手库函数”(iphlpapi.dll)获得IP协议统计情况的四个函数是:GetIpStatistics、GetIcmpStatistics、GetTcpStatistics以及GetUdpStatistics。 16 第4章 各功能模块的具体实现 本系统分为三大功能模块:监视IP模块,查看流量模块和IP协议统计情况模块。以下对各功能模块的具体实现进行详细的介绍。 4.1 监视IP模块 此模块用来追踪本机使用TCP/IP协议的连接状态。这些状态例如,本机IP使用某一连接端口,连接到远程设备的IP以及连接端口的状态。实现的算法如下: 第一步,在获取远程计算机IP地址前,首先要先确定设备是否使用的是TCP通信协议,调用iplpapi.dll库中的GetTcpTable ()函数,它的作用是返回当前系统中全部有效的TCP连接。而其中的自定义变量LngRequired参数是属于引用地址类型。当调用GetTcpTable () 函数时会自动填入LngRequired的数值。如果小于等于0,表示设备没有使用TCP协议。 第二步,调用GetTcpTable API函数取回的信息是以一个MIB_TCPROW结构的数组出现的: Type MIB_TCPROW dwState As Long TCP连接状态 dwLocalAddr As Long 为连接指定一个本地IP地址 dwLocalPort As Long 为连接指定一个本地端口 dwRemoteAddr As Long 为连接指定远程IP地址 dwRemotePort As Long 为连接指定远程端口 End Type 其中dwState各状态说明如下: MIB_TCP_STATE_CLOSED “关闭”状态 MIB_TCP_STATE_CLOSING “正在关闭”状态 MIB_TCP_STATE_CLOSE_WAIT “关闭等待”状态 MIB_TCP_STATE_DELETE_TCB “删除”状态 17 MIB_TCP_STATE_ESTAB “已建立”状态 MIB_TCP_STATE_FIN_WAIT 1 “FINWAIT 1”状态 MIB_TCP_STATE_FIN_WAIT 2 “FINWAIT 2”状态 MIB_TCP_STATE_LAST_ACK “最后一次确认”状态 MIB_TCP_STATE_LISTEN “正在监听”状态 MIB_TCP_STATE_SYN_RCVD “同步接收”状态 MIB_TCP_STATE_SYN_SENT “同步发送”状态 MIB_TCP_STATE_TIME_WAIT “时间等待”状态 MIB_TCPROW结构中的包含着主机IP地址的成员,用长整型的数据形式存储着一个地址,这个地址的每一部分是存储在四个字节长整型值中的一个字节中。 第三步,调用wsock32.dll库中的inet_ntoa API函数,以长整型值的形式接收Internet地址和返回一个通过点符号形式包含着一个IP地址的字符指针。将inet_ntoa API函数返回的一个通过点符号形式包含着一个IP地址的字符指针,放到MIB_TCPROW应用程序缓冲区中。GetTcpTable API函数中的IpTCPTable参数,它是一个指针,指向这个缓冲区,取出接收到的四个字节TCP信息,送到TCPROW变量中。 第四步,在网络协议中处理的字节顺序和Intel处理器的主机处理的字节顺序是不同的。当通过网线发送数值变量时,对网络上的第一个字节,在Intel计算机却为最后一个字节。MIB_TCPROW结构的形式返回的端口号是网络字节顺序的。所以需要把它们转换成主机字节顺序来获取真正的值。这就要用到wsock32.dll库中的ntohs API函数,它将4字节数据类型从网络字节顺序转换到主机字节顺序。 第五步:调用kernel32函数库中的lstrcpyA,因为有时API函数返回的字符指针不能在VB字符串数据类型中直接取出,Win32API提供了C函数lstrcpy,它允许我们通过字符串的指针将字符串复制到另一个变量中。 18 4.2查看流量模块 此模块用来对本机流入和流出的数据量进行实时的监控,并统计总的流进,流出量。具体的实现步骤如下: 第一步用“IP助手库函数”可获取当前所有的网络连接情况,其中包括使用网卡的局域网连接,以及使用ISDN或调制解调器的拨号网络连接。可获取的信息包括:连接速度、界面类型、操作状态、当前总共收到和发送的字节数,等等。其中“总共收到和发送的字节数”等信息完全是累计的。也就是说,这些信息不受网络连接断开的影响(如拨号网络),能完整记录各网络全天的吞吐总量。 第二步,使用“IP助手库函数”中有关吞吐量的函数GetIfTable()等,其定义为: Private Declare Function GetIfTable Lib "iphlpapi" (ByRef pIfTable As Any, _ByRef pdwSize As Long, ByVal bOrder As Long) As Long 第三步,GetIfTable函数的第一个参数指向一个缓冲区,函数执行后该缓冲区内被填入各网络连接的最新数据。缓冲区的结构是: 网络连接总数+网络连接,结构数据+网络连接,结构数据+... 其中“网络连接总数”占4个字节;每个“网络连接数据”的结构为: Private Type MIB_IFROW wszName(0 To 511) As Byte dwIndex As Long 编号 dwType As Long 界面类型 dwMtu As Long 最大传输单元 dwSpeed As Long 界面速度 dwPhysAddrLen As Long 物理地址部分有效长度 bPhysAddr(0 To 7) As Byte 物理地址 dwAdminStatus As Long 管理状态 dwOperStatus As Long 操作状态 19 dwLastChange As Long 操作状态最近更新时间 dwInOctets As Long 总共收到(字节) dwInUcastPkts As Long 总共收到(unicast包) dwInNUcastPkts As Long 总共收到(non-unicast包) dwInDiscards As Long 丢弃包总数(收到) dwInErrors As Long 出错包总数(收到) dwInUnknownProtos As Long 其它包总数(收到) dwOutOctets As Long 总共发送(字节) dwOutUcastPkts As Long 总共发送(unicast包) ) dwOutNUcastPkts As Long 总共发送(non-unicast包 dwOutDiscards As Long 丢弃包总数(发送) dwOutErrors As Long 出错包总数(发送) dwOutQLen As Long 发送队列长度 dwDescrLen As Long 界面描述部分有效长度 bDescr(0 To 255) As Byte 界面描述 End Type 第四步,将“网络连接数据”的结构中有关进出流量的信息显示出来。 4.3 IP协议统计情况模块 此模块的功能是对在本地计算机上对IP协议统计情况行管理和查询。用于获得IP协议统计情况的四个函数是:GetIpStatistics()、GetIcmpStatistics()、GetTcpStatistics()以及GetUdpStatistics()。具体实现步骤如下: 第一步,利用第一个统计函数GetIpStatistics(),可获得当前计算机上的IP统计情况,它的定义如下: GetIpStatistics MIB_IPSTATS IpStats 20 IpStats参数是一个指针,指向MIB_IPSTATA结构,这个结构接收你的计算机当前的IP统计情况。MIB_IPSTATS结构的格式如下: Type def struct_MIB_IPSTATS dwForwarding As Long 说明你的计算机上是启用,还是禁止 转发IP包。 dwDefaultTTL As Long 为你的计算机所发出的数据报指定最 初的生存期(TTL)的值。 dwInReceives As Type 说明已收到多少数据报。 dwInHdrErrors As Long 说明已收到多少报头有误的数据报。 dwInAddrErrors As Long 说明已收到多少地址有误的数据报。 dwForwDatagrams As Long 说明已转发多少数据报。 dwInUnknownProtos As Long 说明已收到多少协议不明的数据报。 dwInDiscards As Long 说明已收到多少已丢弃的数据报。 dwInDelivers As Long 说明已收到多少已投递的数据报。 dwOutRequests As Long 说明IP请求传输多少数据报。 dwRoutingDiscards As Long 说明已丢弃的外出数据报有多少。 dwOutDiscards As Long 说明丢弃的传输数据报有多少。 dwOutNoRoutes As Long 说明没有路由目标的数据报有多少。 dwReasmTimeout As Long 说明分段数据报完全到达的最长间。 dwReasmReqds As Long 说明需要重组的数据报有多少。 dwReasmOks As Long 说明已成功重组的数据报有多少。 dwReasmFails As Long 说明不能进行重组分段的数据报有 多少。 dwFragOks As Long 说明已成功分段的数据报有多少。 dwFragFails As Long 说明不能进行分段的数据报有多少。 dwFragCreates As Long 说明可被分段的数据报有多少。 dwNumIf As Long 说明你的计算机上可用的IP接口有 多少。 dwNumAddr As Long 说明你的计算机上标识的IP地址有 多少。 21 dwNumRoutes As Long 说明路由表中可用的路由有多少。 第二步,利用第二个统计函数:GetIcmpStatistics(),用于获得“互联网控制协议”(ICMP)统计情况。它的定义如下: GetIcmpStatistics MIB_ICMP IpStats IpStats参数是一个指针,指向MIB_ICMP结构,这个结构接收你的计算机上当前的ICMP统计情况。MIB_ICMP结构的格式如下: Typedef struct_MIB_ICMP MIBICMPINFO stats; MIB_ICMP,*PMIB_ICMP; 一眼可见,这个MIB_ICMP结构中另包含一个MIBICMPINFO结构,后者的格式如下: typedef struct _MIBICMPINFO MIBICMPSTATS icmpInStats; MIBICMPSTATS icmpOutStats; }MIBICMPINFO; MIBICMPINFO结构通过MIBICMPSTATS结构接收接入或外出的ICMP信息。icmpInStats参数接收接入数据,而icmpOutStats参数则接收外出数据。MIBICMPSTATS结构的格式如下: Typedef struct_MIBICMPSTATS dwMsgs As Long 说明已收发多少消息。 dwErrors As Long 说明已收发多少错误。 dwDestUnreachs As Long 说明已收发多少“目标不可 达”消息。 dwTimeExcds As Long 说明已收发多少“目标不可 抵达”消息。 dwParmProbs As Long 说明已收发多少“目标不可 抵达”消息。 dwSrcQuenchs As Long 说明已收发多少源结束消息。 dwRedirects As Long 说明已收发多少重定向消息。 22 dwEchos As Long 说明已收发多少ICMP响应应 答。 dwEchoReps As Long 说明已收发多少时间戳请求。 dwTimestamps As Long 说明已收发多少时间戳请求。 dwTimestampReps As Long 说明已收发多少时间戳响应。 dwAddrMasks As Long 说明已收发多少地址掩码。 dwAddrMaskReps As Long 说明已收发多少地址掩码响 应。 第三步,用于获得IP统计情况的第三个统计函数是GetTcpStatistcs(),它的定义如下: DWORD GetTcpStatistics PMIB_TCPSTATS IpSTATS IpStats参数是一个指针,指向MIB_TCPSTATS结构,这个结构接收你的计算机当前的IP统计。MIB_TCPSTATS结构的格式如下: Typedefstruct_MIB_TCPSTATS dwRtoAlgorithm As Long 说明即将采用哪种重传输算法。有效值 包括:MIB_TCP_RTO_CONSTANT, MIB_TCP_RTO_RSRE, MIB_TCP_RTO_VANJ以及针对其他类 型的MIB_TCP_RTO_OTHER dwRtoMin As Long 说明重传输超时的最小值,以毫秒计。 dwRtoMax As Long 说明重传输超时的最大值,以毫秒计。 dwMaxConn As Long 说明最多能接受多少连接。 dwActiveOpens As Long 说明你的计算机向服务器发起了多少次 连接。 dwPassiveOpens As Long 说明你的计算机监听了多少次客户机出 的连接。 dwAttemptFails As Long 说明尝试连接失败的次数是多少。 dwEstabResets As Long 说明对已建立的连接实行了多少次。 dwCurrEstab As Long 说明目前已建立的连接有多少。 23 dwInSegs As Long 说明收到了多少分段数据报。 dwOutSegs As Long 说明重设标志后,又传输了多少分段数 据报。 dwRetransSegs As Long 说明已传输了多少分段数据报。 dwInErrs As Long 说明收到多少错误。 dwOutRsts As Long 说明重设标志后,又传输了多少分段数 据报。 dwNumConns As Long 说明连接的总数是多少。 第四步,最后一个统计函数GetUdpStatistics(),用于获得本地计算机上的UDP统计情况。它的定义如下: DWORD GetUdpStatistics PMIB_UDPSTATS IpStats IpStats参数是一个指针,指向MIB_UDPSTATS结构,这个结构接收你的计算机当前的IP统计。MIB_UDPSTATS结构的格式如下: Type defstruct_MIB_UDPSTATS dwInDatagrams As Long 说明已收到多少数据报。 dwNoPorts As Long 说明因为端口号有误而丢弃了多少数 据报。 dwInErrors As Long 说明已收到多少错误数据报(除 dwNoPorts中统计的数目之外)。 dwOutDatagrams As Long 说明已传输多少数据报。 dwNumAddrs As Long 说明监听者表中有多少UDP条目。 24 第5章 程序运行分析 5.1 功能选择界面 本界面完成以下功能: 1(监视IP:显示本机IP和连接到本机的远程计算机IP,及所使用 的端口。 2(查看流量:显示本机流入和流出的数据量。 3(信息统计:显示TCP、IP、UDP、ICMP协议各个参数的数值。 5.2 IP监视界面运行结果分析 由记录得出本地的进出流量、进出IP和端口: 25 (1) 在无连接时,TCP状态为监听中,远程IP为空:0.0.0.0,本地IP为202.196.39.161。 (2) 当远程IP:202.196.32.7,80发出的连接被接受时,TCP状态为已连接,本地IP为202.196.39.161,3092。 5.3 查看流量界面运行结果分析 本界面主要记录的是接收发送流量的速度,和累计发送和接收的流量。 由记录可看出: (1) 当前的接收速度为23KB,发送速度为3KB。 (2) 累计接收流量为23,328KB,发送流量为1,746KB。 26 5.4 IP协议统计情况界面运行结果分析 本界面主要实现的是可在本地计算机上对IP协议统计情况行管理和查询。 针对此界面的要求,选取具有UDP信息统计进行分析:已收到数据报数为2915;端口有误的数据报数为834;已收到错误数据报数为0;已发送数据报数为2757;监听者表中的UDP条目为29。 27 第6章 结论 历时三个多月的毕业设计就要结束了,在整个毕业设计过程中,我学习到了许多以前没有接触过的新知识,也遇到了一些困难,在老师的悉心指导和同学的热心帮助下,克服了困难,完成了毕业设计。 本次毕业设计题目是网络监控系统,从开发工具到操作系统都经过了深思熟虑。我选用Visual Basic作为开发工具,基本实现了题目要求的目标。 本系统可以对网络当前的进出流量进行统计,同时增加了网络监控功能对本地IP,端口和远程IP,端口进行监控,从而发现可疑的连接。可以对本机的IP协议统计情况进行查询和管理。从而一些未知的木马程序或其他程序会被挡在网络之外而维护系统的稳定和保护私人数据的安全。 通过这次毕业设计,锻炼了我的实践能力,可以很熟练的应用Visual Basic进行软件开发,而且能将自己平时所学到的知识应用于实践开发当中。同时,掌握了Internet和网络TCP/IP协议的基础知识,更好的熟悉了使用API函数编程的相关知识,扩大了自己的知识面,为以后的学术研究奠定了扎实的基础。 28 致 谢 毕业设计的完成离不开老师和同学们的帮助,孙红艳老师给予我很多悉心的指导和帮助,在此我表示由衷地感谢。 同时还要感谢我的同学们,他们对我的毕业设计也提出了很好的。 再次感谢所有关心我的人,正是你们的关心,我的毕业设计才能得以顺利的完成。 谢谢大家~ 29 附 录:计算机网络连接监控系统程序代码 欢迎界面 Private Sub Command1_Click() Menu.Show End Sub Private Sub Command2_Click() Unload Me End Sub Private Sub Form_Load() Me.Caption = "欢迎使用" End Sub 30 登陆界面 Private Sub Command1_Click() IpMonitor.Show End Sub Private Sub Command2_Click() FrmMain.Show End Sub Private Sub Command3_Click() Unload Me End Sub Private Sub Command4_Click() FrmSettings.Show End Sub Private Sub Command5_Click() FrmStats.Show End Sub Private Sub Command6_Click() FrmMenu.Show End Sub Private Sub Form_Load() Me.Caption = "计算机网络连接监控系统" End Sub 31 监视IP ' 取得 TCP 连接状态表 Option Explicit Private Type MIB_TCPROW dwState As Long ' TCP连接状态 dwLocalAddr As Long ' 本机IP dwLocalPort As Long ' 本机端口编号 dwRemoteAddr As Long ' 远程IP dwRemotePort As Long ' 远程端口编号 End Type Private Const ERROR_SUCCESS As Long = 0 Private Const MIB_TCP_STATE_CLOSED As Long = 1 Private Const MIB_TCP_STATE_LISTEN As Long = 2 Private Const MIB_TCP_STATE_SYN_SENT As Long = 3 Private Const MIB_TCP_STATE_SYN_RCVD As Long = 4 Private Const MIB_TCP_STATE_ESTAB As Long = 5 Private Const MIB_TCP_STATE_FIN_WAIT1 As Long = 6 Private Const MIB_TCP_STATE_FIN_WAIT2 As Long = 7 Private Const MIB_TCP_STATE_CLOSE_WAIT As Long = 8 Private Const MIB_TCP_STATE_CLOSING As Long = 9 Private Const MIB_TCP_STATE_LAST_ACK As Long = 10 Private Const MIB_TCP_STATE_TIME_WAIT As Long = 11 Private Const MIB_TCP_STATE_DELETE_TCB As Long = 12 Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dst As Any, src As Any, ByVal bcount As Long) Private Declare Function lstrcpyA Lib "kernel32" (ByVal RetVal As String, ByVal Ptr As Long) As Long Private Declare Function lstrlenA Lib "kernel32" (ByVal Ptr As Any) As Long Private Declare Function inet_ntoa Lib "wsock32.dll" (ByVal addr As 32 Long) As Long Private Declare Function ntohs Lib "wsock32.dll" (ByVal addr As Long) As Long Public Function GetInetAddrStr(Address As Long) As String '呼叫 wsock32.dll 并且取得地址所使用的 Handle 值 GetInetAddrStr = GetString(inet_ntoa(Address)) End Function ' 初始化 ListView1 控件的行标题 With ListView1 .View = lvwReport " .ColumnHeaders.Add , , "本机IP地址 .ColumnHeaders.Add , , "本机端口 " " .ColumnHeaders.Add , , "远程IP .ColumnHeaders.Add , , "远程端口 " .ColumnHeaders.Add , , "状态 " End With Me.Caption = "TCP 连接表监视清单" Timer1.Enabled = True End Sub Private Sub Form_Resize() ListView1.Height = Me.Height - 30 * Screen.TwipsPerPixelY ListView1.Width = Me.Width - 12 * Screen.TwipsPerPixelX End Sub '将长整数转换为字符串 Public Function GetString(ByVal lpszA As Long) As String GetString = String$(lstrlenA(ByVal lpszA), 0) Call lstrcpyA(ByVal GetString, ByVal lpszA) End Function Private Sub GetTCPDatas() Dim TcpRow As MIB_TCPROW Dim Buffer() As Byte 33 Dim LngRequired As Long Dim LngStructureSize As Long Dim lngRows As Long Dim LngCounter As Long Dim strTemps As String Dim ListX As ListItem ListView1.ListItems.Clear Call GetTcpTable(ByVal 0&, LngRequired, 1) If LngRequired > 0 Then ReDim Buffer(0 To LngRequired - 1) As Byte If GetTcpTable(Buffer(0), LngRequired, 1) = ERROR_SUCCESS Then LngStructureSize = LenB(TcpRow) '起始的四个字节,是做为表示进入点的数字 CopyMemory lngRows, Buffer(0), 4 For LngCounter = 1 To lngRows ' 将上述获得四个字节的相关数据,拷贝到 TcpRow 的结构之中 CopyMemory TcpRow, Buffer(4+(LngCounter- 1) * LngStructureSize), LngStructureSize ' 将结果传送到 ListView 之中 With TcpRow Set ListX= ListView1.ListItems.Add(, , GetInetAddrStr(.dwLocalAddr)) ListX.SubItems(1) = ntohs(.dwLocalPort) ListX.SubItems(2) = GetInetAddrStr(.dwRemoteAddr) ListX.SubItems(3) = ntohs(.dwRemotePort) ListX.SubItems(4) = (.dwState) Select Case .dwState Case MIB_TCP_STATE_CLOSE_WAIT: strTemps = "结束等 待" Case MIB_TCP_STATE_CLOSED: strTemps = "已结束" Case MIB_TCP_STATE_CLOSING: strTemps = "结束 34 中..." Case MIB_TCP_STATE_DELETE_TCB: strTemps = "已删除TCB" Case MIB_TCP_STATE_ESTAB: strTemps = "已连接" Case MIB_TCP_STATE_FIN_WAIT1: strTemps = "FIN延时处理1" Case MIB_TCP_STATE_FIN_WAIT2: strTemps = "FIN延时处理2" Case MIB_TCP_STATE_LAST_ACK: strTemps ="上次取得的确认信号" Case MIB_TCP_STATE_LISTEN: strTemps = "监听中..." Case MIB_TCP_STATE_SYN_SENT: strTemps = "传送" Case MIB_TCP_STATE_SYN_RCVD: strTemps = "数据接收中" Case MIB_TCP_STATE_TIME_WAIT: strTemps = "等候中..." End Select ListX.SubItems(4) = ListX.SubItems(4) & "( " & strTemps & " )" strTemps = "" End With Next End If End If End Sub Private Sub Timer1_Timer() GetTCPDatas End Sub 35 IP协议统计情况 Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function SetWindowRgn Lib "User32" (ByVal hwnd As Long, ByVal hrgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function ReleaseCapture Lib "User32" () As Long Dim IP As MIB_IPSTATS Dim tcp As MIB_TCPSTATS Dim udp As MIB_UDPSTATS Dim icmp As MIBICMPINFO Dim tStats As MIB_TCPSTATS Dim sControlSelected As String Private Sub Form_Load() sControlSelected = "tcp" Call imgSelected_Click(0) Call LoadColors Call SetColors(Me) Me.Width = 4560 With ListView1.ListItems ' .Add , , "超时算法" .Add , , "最小超时算法" .Add , , "最大超时算法" .Add , , "最大连接数" .Add , , "主动打开" .Add , , "被动打开" .Add , , "尝试失败" .Add , , "重新建立被重置的连接" .Add , , "建立连接" .Add , , "已经接收的数据片段" .Add , , "已经发送的数据片段" 36 .Add , , "片段数据再生" .Add , , "数据流入错误" .Add , , "数据流出错误" .Add , , "连接累加值" ' End With With ListView2.ListItems .Add , , "启用或禁止转发IP包" .Add , , "数据报默认生存期" .Add , , "已接收的数据报" .Add , , "已接收错误的数据报报头" .Add , , "已接收错误的数据报地址" .Add , , "已转发的数据报" .Add , , "已收到不明协议的数据报" .Add , , "收到已丢弃的数据报" .Add , , "收到已投递的数据报" .Add , , "请求传输的数据报" .Add , , "已丢弃的外出数据报" .Add , , "丢弃的传输数据报" .Add , , "没有路由目标的数据报" .Add , , "分段数据报完全到达的最长时间" .Add , , "需重组数据报数" .Add , , "重组成功" .Add , , "重组失败" .Add , , "分段成功的数据报" .Add , , "分段失败的数据报" .Add , , "数据报片段数" .Add , , "计算机可用IP接口数" .Add , , "计算机上标识的IP地址数" .Add , , "路由表中可用的路由" End With With ListView3.ListItems .Add , , "已收到数据报" .Add , , "端口有误的数据报" .Add , , "已收到错误数据报" .Add , , "已发送数据报" 37 .Add , , "监听者表中的UDP条目" End With With ListView4.ListItems .Add , , "已收发消息数" " .Add , , "错误数 .Add , , "目标不可抵达消息数" .Add , , "生存期已过消息数" .Add , , "表明数据报内有错误IP信息的消息" .Add , , "源结束消息数" .Add , , "重定向消息数" .Add , , "ICMP响应请求" .Add , , "ICMP响应应答" .Add , , "时间戳请求" .Add , , "时间戳响应" .Add , , "地址掩码" .Add , , "地址掩码响应" End With With ListView5.ListItems .Add , , "已收发消息数" .Add , , "错误数" .Add , , "目标不可抵达消息数" .Add , , "生存期已过消息数" .Add , , "表明数据报内有错误IP信息的消息" .Add , , "源结束消息数" .Add , , "重定向消息数" .Add , , "ICMP响应请求" .Add , , "ICMP响应应答" .Add , , "时间戳请求" .Add , , "时间戳响应" .Add , , "地址掩码" .Add , , "地址掩码响应" End With Call GetTcpStatistics(tStats) With tStats 38 ListView1.ListItems(1).SubItems(1) = .dwRtoAlgorithm ListView1.ListItems(2).SubItems(1) = .dwRtoMin ListView1.ListItems(3).SubItems(1) = .dwRtoMax ListView1.ListItems(4).SubItems(1) = .dwMaxConn ListView1.ListItems(5).SubItems(1) = .dwActiveOpens ListView1.ListItems(6).SubItems(1) = .dwPassiveOpens ListView1.ListItems(7).SubItems(1) = .dwAttemptFails ListView1.ListItems(8).SubItems(1) = .dwEstabResets ListView1.ListItems(9).SubItems(1) = .dwCurrEstab ListView1.ListItems(10).SubItems(1) = .dwInSegs ListView1.ListItems(11).SubItems(1) = .dwOutSegs ListView1.ListItems(12).SubItems(1) = .dwRetransSegs ListView1.ListItems(13).SubItems(1) = .dwInErrs ListView1.ListItems(14).SubItems(1) = .dwOutRsts ListView1.ListItems(15).SubItems(1) = .dwNumConns End With DoEvents Call GetIpStatistics(IP) With IP ListView2.ListItems(1).SubItems(1) = .dwForwarding ListView2.ListItems(2).SubItems(1) = .dwDefaultTTL ListView2.ListItems(3).SubItems(1) = .dwInReceives ListView2.ListItems(4).SubItems(1) = .dwInHdrErrors ListView2.ListItems(5).SubItems(1) = .dwInAddrErrors ListView2.ListItems(6).SubItems(1) = .dwForwDatagrams ListView2.ListItems(7).SubItems(1) = .dwInUnknownProtos ListView2.ListItems(8).SubItems(1) = .dwInDiscards ListView2.ListItems(9).SubItems(1) = .dwInDelivers ListView2.ListItems(10).SubItems(1) = .dwOutRequests ListView2.ListItems(11).SubItems(1) = .dwRoutingDiscards ListView2.ListItems(12).SubItems(1) = .dwOutDiscards ListView2.ListItems(13).SubItems(1) = .dwOutNoRoutes ListView2.ListItems(14).SubItems(1) = .dwReasmTimeout ListView2.ListItems(15).SubItems(1) = .dwReasmReqds ListView2.ListItems(16).SubItems(1) = .dwReasmOks ListView2.ListItems(17).SubItems(1) = .dwReasmFails 39 ListView2.ListItems(18).SubItems(1) = .dwFragOks ListView2.ListItems(19).SubItems(1) = .dwFragFails ListView2.ListItems(20).SubItems(1) = .dwFragCreates ListView2.ListItems(21).SubItems(1) = .dwNumIf ListView2.ListItems(22).SubItems(1) = .dwNumAddr ListView2.ListItems(23).SubItems(1) = .dwNumRoutes End With DoEvents Call GetUdpStatistics(udp) With udp ListView3.ListItems(1).SubItems(1) = .dwInDatagrams ListView3.ListItems(2).SubItems(1) = .dwNoPorts ListView3.ListItems(3).SubItems(1) = .dwInErrors ListView3.ListItems(4).SubItems(1) = .dwOutDatagrams ListView3.ListItems(5).SubItems(1) = .dwNumAddrs End With DoEvents Call GetIcmpStatistics(icmp) With icmp ListView4.ListItems(1).SubItems(1) = .icmpInStats.dwMsgs ListView4.ListItems(2).SubItems(1) = .icmpInStats.dwErrors ListView4.ListItems(3).SubItems(1) = .icmpInStats.dwDestUnreachs ListView4.ListItems(4).SubItems(1) = .icmpInStats.dwTimeExcds ListView4.ListItems(5).SubItems(1) = .icmpInStats.dwParmProbs ListView4.ListItems(6).SubItems(1) = .icmpInStats.dwSrcQuenchs ListView4.ListItems(7).SubItems(1) = .icmpInStats.dwRedirects ListView4.ListItems(8).SubItems(1) = .icmpInStats.dwEchos ListView4.ListItems(9).SubItems(1) = .icmpInStats.dwEchoReps ListView4.ListItems(10).SubItems(1) = .icmpInStats.dwTimestamps ListView4.ListItems(11).SubItems(1) = .icmpInStats.dwTimestampReps ListView4.ListItems(12).SubItems(1) = .icmpInStats.dwAddrMasks ListView4.ListItems(13).SubItems(1) = .icmpInStats.dwAddrMaskReps DoEvents ListView5.ListItems(1).SubItems(1) = .icmpOutStats.dwMsgs 40 ListView5.ListItems(2).SubItems(1) = .icmpOutStats.dwErrors ListView5.ListItems(3).SubItems(1) = .icmpOutStats.dwDestUnreachs ListView5.ListItems(4).SubItems(1) = .icmpOutStats.dwTimeExcds ListView5.ListItems(5).SubItems(1) = .icmpOutStats.dwParmProbs ListView5.ListItems(6).SubItems(1) = .icmpOutStats.dwSrcQuenchs ListView5.ListItems(7).SubItems(1) = .icmpOutStats.dwRedirects ListView5.ListItems(8).SubItems(1) = .icmpOutStats.dwEchos ListView5.ListItems(9).SubItems(1) = .icmpOutStats.dwEchoReps ListView5.ListItems(10).SubItems(1) = .icmpOutStats.dwTimestamps ListView5.ListItems(11).SubItems(1) = .icmpOutStats.dwTimestampReps ListView5.ListItems(12).SubItems(1) = .icmpOutStats.dwAddrMasks ListView5.ListItems(13).SubItems(1) = .icmpOutStats.dwAddrMaskReps End With DoEvents End Sub Private Sub imgClose_Click() If bBottomOut = True Then iRelBottomTrayOffset = FrmMain.Top Do While FrmStats.Top > iRelBottomTrayOffset FrmStats.Top = FrmStats.Top - 30 FrmMain.ZOrder DoEvents Loop sliding down Unload FrmStats bBottomOut = False End If End Sub Private Sub imgClose_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then imgClose.Picture = Image5.Picture End If 41 End Sub Private Sub imgClose_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then imgClose.Picture = Image8.Picture End If End Sub Private Sub UpdateStats1() On Error Resume Next Dim tStats As MIB_TCPSTATS Static tStaticStats As MIB_TCPSTATS Dim lRetValue As Long Dim blnIsSent As Boolean Dim blnIsRecv As Boolean lRetValue = GetTcpStatistics(tStats) With tStats If Not tStaticStats.dwRtoAlgorithm = .dwRtoAlgorithm Then _ ListView1.ListItems(1).SubItems(1) = .dwRtoAlgorithm If Not tStaticStats.dwRtoMin = .dwRtoMin Then _ ListView1.ListItems(2).SubItems(1) = .dwRtoMin If Not tStaticStats.dwRtoMax = .dwRtoMax Then _ ListView1.ListItems(3).SubItems(1) = .dwRtoMax If Not tStaticStats.dwMaxConn = .dwMaxConn Then _ ListView1.ListItems(4).SubItems(1) = .dwMaxConn If Not tStaticStats.dwActiveOpens = .dwActiveOpens Then _ ListView1.ListItems(5).SubItems(1) = .dwActiveOpens If Not tStaticStats.dwPassiveOpens = .dwPassiveOpens Then _ ListView1.ListItems(6).SubItems(1) = .dwPassiveOpens If Not tStaticStats.dwAttemptFails = .dwAttemptFails Then _ ListView1.ListItems(7).SubItems(1) = .dwAttemptFails If Not tStaticStats.dwEstabResets = .dwEstabResets Then _ ListView1.ListItems(8).SubItems(1) = .dwEstabResets 42 If Not tStaticStats.dwCurrEstab = .dwCurrEstab Then _ ListView1.ListItems(9).SubItems(1) = .dwCurrEstab If Not tStaticStats.dwInSegs = .dwInSegs Then _ ListView1.ListItems(10).SubItems(1) = .dwInSegs If Not tStaticStats.dwOutSegs = .dwOutSegs Then _ ListView1.ListItems(11).SubItems(1) = .dwOutSegs If Not tStaticStats.dwRetransSegs = .dwRetransSegs Then _ ListView1.ListItems(12).SubItems(1) = .dwRetransSegs If Not tStaticStats.dwInErrs = .dwInErrs Then _ ListView1.ListItems(13).SubItems(1) = .dwInErrs If Not tStaticStats.dwOutRsts = .dwOutRsts Then _ ListView1.ListItems(14).SubItems(1) = .dwOutRsts If Not tStaticStats.dwNumConns = .dwNumConns Then _ ListView1.ListItems(15).SubItems(1) = .dwNumConns End With tStaticStats = tStats End Sub Private Sub UpdateStats2() On Error Resume Next Static ip2 As MIB_IPSTATS Dim lRetValue As Long lRetValue = GetIpStatistics(IP) With IP If Not ip2.dwForwarding = .dwForwarding Then _ ListView2.ListItems(1).SubItems(1) = .dwForwarding If Not ip2.dwDefaultTTL = .dwDefaultTTL Then _ ListView2.ListItems(2).SubItems(1) = .dwDefaultTTL If Not ip2.dwInReceives = .dwInReceives Then _ ListView2.ListItems(3).SubItems(1) = .dwInReceives If Not ip2.dwInHdrErrors = .dwInHdrErrors Then _ ListView2.ListItems(4).SubItems(1) = .dwInHdrErrors If Not ip2.dwInAddrErrors = .dwInAddrErrors Then _ ListView2.ListItems(5).SubItems(1) = .dwInAddrErrors 43 If Not ip2.dwForwDatagrams = .dwForwDatagrams Then _ ListView2.ListItems(6).SubItems(1) = .dwForwDatagrams If Not ip2.dwInUnknownProtos = .dwInUnknownProtos Then _ ListView2.ListItems(7).SubItems(1) = .dwInUnknownProtos If Not ip2.dwInDiscards = .dwInDiscards Then _ ListView2.ListItems(8).SubItems(1) = .dwInDiscards If Not ip2.dwInDelivers = .dwInDelivers Then _ ListView2.ListItems(9).SubItems(1) = .dwInDelivers If Not ip2.dwOutRequests = .dwOutRequests Then _ ListView2.ListItems(10).SubItems(1) = .dwOutRequests If Not ip2.dwRoutingDiscards = .dwRoutingDiscards Then _ ListView2.ListItems(11).SubItems(1) = .dwRoutingDiscards If Not ip2.dwOutDiscards = .dwOutDiscards Then _ ListView2.ListItems(12).SubItems(1) = .dwOutDiscards If Not ip2.dwOutNoRoutes = .dwOutNoRoutes Then _ ListView2.ListItems(13).SubItems(1) = .dwOutNoRoutes If Not ip2.dwReasmTimeout = .dwReasmTimeout Then _ ListView2.ListItems(14).SubItems(1) = .dwReasmTimeout If Not ip2.dwReasmReqds = .dwReasmReqds Then _ ListView2.ListItems(15).SubItems(1) = .dwReasmReqds If Not ip2.dwReasmOks = .dwReasmOks Then _ ListView2.ListItems(16).SubItems(1) = .dwReasmOks If Not ip2.dwReasmFails = .dwReasmFails Then _ ListView2.ListItems(17).SubItems(1) = .dwReasmFails If Not ip2.dwFragOks = .dwFragOks Then _ ListView2.ListItems(18).SubItems(1) = .dwFragOks If Not ip2.dwFragFails = .dwFragFails Then _ ListView2.ListItems(19).SubItems(1) = .dwFragFails If Not ip2.dwFragCreates = .dwFragCreates Then _ ListView2.ListItems(20).SubItems(1) = .dwFragCreates If Not ip2.dwNumIf = .dwNumIf Then _ ListView2.ListItems(21).SubItems(1) = .dwNumIf If Not ip2.dwNumAddr = .dwNumAddr Then _ ListView2.ListItems(22).SubItems(1) = .dwNumAddr If Not ip2.dwNumRoutes = .dwNumRoutes Then _ ListView2.ListItems(23).SubItems(1) = .dwNumRoutes End With 44 ip2 = IP End Sub Private Sub UpdateStats3() On Error Resume Next Dim lRetValue As Long Static udp2 As MIB_UDPSTATS lRetValue = GetUdpStatistics(udp) With udp If Not udp2.dwInDatagrams = .dwInDatagrams Then _ ListView3.ListItems(1).SubItems(1) = .dwInDatagrams If Not udp2.dwNoPorts = .dwNoPorts Then _ ListView3.ListItems(2).SubItems(1) = .dwNoPorts If Not udp2.dwInErrors = .dwInErrors Then _ ListView3.ListItems(3).SubItems(1) = .dwInErrors If Not udp2.dwOutDatagrams = .dwOutDatagrams Then _ ListView3.ListItems(4).SubItems(1) = .dwOutDatagrams If Not udp2.dwNumAddrs = .dwNumAddrs Then _ ListView3.ListItems(5).SubItems(1) = .dwNumAddrs End With udp2 = udp End Sub Private Sub UpdateStats4() On Error Resume Next Dim lRetValue As Long Static icmp2 As MIBICMPINFO 45 lRetValue = GetIcmpStatistics(icmp) With icmp If Not icmp2.icmpOutStats.dwMsgs = .icmpOutStats.dwMsgs Then _ ListView4.ListItems(1).SubItems(1) = .icmpOutStats.dwMsgs If Not icmp2.icmpOutStats.dwErrors = .icmpOutStats.dwErrors Then _ ListView4.ListItems(2).SubItems(1) = .icmpOutStats.dwErrors If Not icmp2.icmpOutStats.dwDestUnreachs = .icmpOutStats.dwDestUnreachs Then _ ListView4.ListItems(3).SubItems(1) = .icmpOutStats.dwDestUnreachs If Not icmp2.icmpOutStats.dwTimeExcds = .icmpOutStats.dwTimeExcds Then _ ListView4.ListItems(4).SubItems(1) = .icmpOutStats.dwTimeExcds If Not icmp2.icmpOutStats.dwParmProbs = .icmpOutStats.dwParmProbs Then _ ListView4.ListItems(5).SubItems(1) = .icmpOutStats.dwParmProbs If Not icmp2.icmpOutStats.dwSrcQuenchs = .icmpOutStats.dwSrcQuenchs Then _ ListView4.ListItems(6).SubItems(1) = .icmpOutStats.dwSrcQuenchs If Not icmp2.icmpOutStats.dwRedirects = .icmpOutStats.dwRedirects Then _ ListView4.ListItems(7).SubItems(1) = .icmpOutStats.dwRedirects If Not icmp2.icmpOutStats.dwEchos = .icmpOutStats.dwEchos Then _ ListView4.ListItems(8).SubItems(1) = .icmpOutStats.dwEchos If Not icmp2.icmpOutStats.dwEchoReps = .icmpOutStats.dwEchoReps Then _ ListView4.ListItems(9).SubItems(1) = .icmpOutStats.dwEchoReps If Not icmp2.icmpOutStats.dwTimestamps = .icmpOutStats.dwTimestamps Then _ ListView4.ListItems(10).SubItems(1) = .icmpOutStats.dwTimestamps If Not icmp2.icmpOutStats.dwTimestampReps = .icmpOutStats.dwTimestampReps Then _ ListView4.ListItems(11).SubItems(1) = .icmpOutStats.dwTimestampReps If Not icmp2.icmpOutStats.dwAddrMasks = .icmpOutStats.dwAddrMasks Then _ ListView4.ListItems(12).SubItems(1) = .icmpOutStats.dwAddrMasks 46 If Not icmp2.icmpOutStats.dwAddrMaskReps = .icmpOutStats.dwAddrMaskReps Then _ ListView4.ListItems(13).SubItems(1) = .icmpOutStats.dwAddrMaskReps End With icmp2 = icmp End Sub Private Sub UpdateStats5() On Error Resume Next Dim lRetValue As Long Static icmp2 As MIBICMPINFO lRetValue = GetIcmpStatistics(icmp) With icmp If Not icmp2.icmpInStats.dwMsgs = .icmpInStats.dwMsgs Then _ ListView4.ListItems(1).SubItems(1) = .icmpInStats.dwMsgs If Not icmp2.icmpInStats.dwErrors = .icmpInStats.dwErrors Then _ ListView4.ListItems(2).SubItems(1) = .icmpInStats.dwErrors If Not icmp2.icmpInStats.dwDestUnreachs = .icmpInStats.dwDestUnreachs Then _ ListView4.ListItems(3).SubItems(1) = .icmpInStats.dwDestUnreachs If Not icmp2.icmpInStats.dwTimeExcds = .icmpInStats.dwTimeExcds Then _ ListView4.ListItems(4).SubItems(1) = .icmpInStats.dwTimeExcds If Not icmp2.icmpInStats.dwParmProbs = .icmpInStats.dwParmProbs Then _ ListView4.ListItems(5).SubItems(1) = .icmpInStats.dwParmProbs If Not icmp2.icmpInStats.dwSrcQuenchs = .icmpInStats.dwSrcQuenchs Then _ ListView4.ListItems(6).SubItems(1) = .icmpInStats.dwSrcQuenchs If Not icmp2.icmpInStats.dwRedirects = .icmpInStats.dwRedirects Then _ ListView4.ListItems(7).SubItems(1) = .icmpInStats.dwRedirects If Not icmp2.icmpInStats.dwEchos = .icmpInStats.dwEchos Then _ 47 ListView4.ListItems(8).SubItems(1) = .icmpInStats.dwEchos If Not icmp2.icmpInStats.dwEchoReps = .icmpInStats.dwEchoReps Then _ ListView4.ListItems(9).SubItems(1) = .icmpInStats.dwEchoReps If Not icmp2.icmpInStats.dwTimestamps = .icmpInStats.dwTimestamps Then _ ListView4.ListItems(10).SubItems(1) = .icmpInStats.dwTimestamps If Not icmp2.icmpInStats.dwTimestampReps = .icmpInStats.dwTimestampReps Then _ ListView4.ListItems(11).SubItems(1) = .icmpInStats.dwTimestampReps If Not icmp2.icmpInStats.dwAddrMasks = .icmpInStats.dwAddrMasks Then _ ListView4.ListItems(12).SubItems(1) = .icmpInStats.dwAddrMasks If Not icmp2.icmpInStats.dwAddrMaskReps = .icmpInStats.dwAddrMaskReps Then _ ListView4.ListItems(13).SubItems(1) = .icmpInStats.dwAddrMaskReps End With icmp2 = icmp End Sub Private Sub imgSelected_Click(Index As Integer) Dim X As Byte 'Clear the radio buttons... For X = 0 To 4 imgSelected(X).Picture = Image6.Picture Next X 'Update the radio buttons... imgSelected(Index).Picture = Image9.Picture 'Remember the control selected... Select Case Index Case 0 sControlSelected = "tcp" Case 1 48 sControlSelected = "ip" Case 2 sControlSelected = "udp" Case 3 sControlSelected = "in" Case 4 sControlSelected = "out" End Select If sControlSelected = "tcp" Then ListView1.Visible = True ListView2.Visible = False ListView3.Visible = False ListView4.Visible = False ListView5.Visible = False End If If sControlSelected = "ip" Then ListView1.Visible = False ListView2.Visible = True ListView3.Visible = False ListView4.Visible = False ListView5.Visible = False End If If sControlSelected = "udp" Then ListView1.Visible = False ListView2.Visible = False ListView3.Visible = True ListView4.Visible = False ListView5.Visible = False End If If sControlSelected = "in" Then ListView1.Visible = False ListView2.Visible = False ListView3.Visible = False ListView4.Visible = True 49 ListView5.Visible = False End If If sControlSelected = "out" Then ListView1.Visible = False ListView2.Visible = False ListView3.Visible = False ListView4.Visible = False ListView5.Visible = True End If End Sub Private Sub Label1_Click(Index As Integer) Dim X As Byte 'Clear the radio buttons... For X = 0 To 4 imgSelected(X).Picture = Image6.Picture Next X 'Update the radio buttons... imgSelected(Index).Picture = Image9.Picture 'Remember the control selected... Select Case Index Case 0 sControlSelected = "tcp" Case 1 sControlSelected = "ip" Case 2 sControlSelected = "udp" Case 3 sControlSelected = "in" Case 4 sControlSelected = "out" End Select If sControlSelected = "tcp" Then 50 ListView1.Visible = True ListView2.Visible = False ListView3.Visible = False ListView4.Visible = False ListView5.Visible = False End If If sControlSelected = "ip" Then ListView1.Visible = False ListView2.Visible = True ListView3.Visible = False ListView4.Visible = False ListView5.Visible = False End If If sControlSelected = "udp" Then ListView1.Visible = False ListView2.Visible = False ListView3.Visible = True ListView4.Visible = False ListView5.Visible = False End If If sControlSelected = "in" Then ListView1.Visible = False ListView2.Visible = False ListView3.Visible = False ListView4.Visible = True ListView5.Visible = False End If If sControlSelected = "out" Then ListView1.Visible = False ListView2.Visible = False ListView3.Visible = False ListView4.Visible = False ListView5.Visible = True End If 51 End Sub Private Sub Timer1_Timer() UpdateStats1 End Sub Private Sub Timer2_Timer() UpdateStats2 End Sub Private Sub Timer3_Timer() UpdateStats3 End Sub Private Sub Timer4_Timer() UpdateStats4 End Sub Private Sub Timer5_Timer() UpdateStats5 End Sub Option Explicit Public Const MIB_TCP_STATE_CLOSED = 0 Public Const MIB_TCP_STATE_LISTEN = 1 Public Const MIB_TCP_STATE_SYN_SENT = 2 Public Const MIB_TCP_STATE_SYN_RCVD = 3 Public Const MIB_TCP_STATE_ESTAB = 4 Public Const MIB_TCP_STATE_FIN_WAIT1 = 5 Public Const MIB_TCP_STATE_FIN_WAIT2 = 6 Public Const MIB_TCP_STATE_CLOSE_WAIT = 7 Public Const MIB_TCP_STATE_CLOSING = 8 Public Const MIB_TCP_STATE_LAST_ACK = 9 Public Const MIB_TCP_STATE_TIME_WAIT = 10 52 Public Const MIB_TCP_STATE_DELETE_TCB = 11 Type MIB_TCPROW dwState As Long dwLocalAddr As String * 4 dwLocalPort As String * 4 dwRemoteAddr As String * 4 dwRemotePort As String * 4 End Type Type MIB_TCPTABLE dwNumEntries As Long table(100) As MIB_TCPROW End Type Declare Function GetTcpTable Lib "IPhlpAPI" _ (pTcpTable As MIB_TCPTABLE, pdwSize As Long, bOrder As Long) As Long Type MIB_UDPROW dwLocalAddr As String * 4 dwLocalPort As String * 4 End Type Type MIB_UDPTABLE dwNumEntries As Long table(100) As MIB_UDPROW End Type Declare Function GetUdpTable Lib "IPhlpAPI" _ (pUdpTable As MIB_UDPTABLE, pdwSize As Long, bOrder As Long) As Long Type MIB_IPSTATS dwDefaultTTL As Long dwForwarding As Long dwInReceives As Long dwInHdrErrors As Long 53 dwInAddrErrors As Long dwForwDatagrams As Long dwInUnknownProtos As Long dwInDiscards As Long dwInDelivers As Long dwOutRequests As Long dwRoutingDiscards As Long dwOutDiscards As Long dwOutNoRoutes As Long dwReasmTimeout As Long dwReasmReqds As Long dwReasmOks As Long dwReasmFails As Long dwFragOks As Long dwFragFails As Long dwFragCreates As Long dwNumIf As Long dwNumAddr As Long dwNumRoutes As Long End Type Declare Function GetIpStatistics Lib "IPhlpAPI" _ (pStats As MIB_IPSTATS) As Long Type MIBICMPSTATS dwMsgs As Long dwErrors As Long dwDestUnreachs As Long dwTimeExcds As Long dwParmProbs As Long dwSrcQuenchs As Long dwRedirects As Long dwEchos As Long dwEchoReps As Long dwTimestamps As Long dwTimestampReps As Long dwAddrMasks As Long dwAddrMaskReps As Long 54 End Type Type MIBICMPINFO icmpInStats As MIBICMPSTATS icmpOutStats As MIBICMPSTATS End Type Declare Function GetIcmpStatistics Lib "IPhlpAPI" _ (pStats As MIBICMPINFO) As Long Type MIB_TCPSTATS dwRtoAlgorithm As Long dwRtoMin As Long dwRtoMax As Long dwMaxConn As Long dwActiveOpens As Long dwPassiveOpens As Long dwAttemptFails As Long dwEstabResets As Long dwCurrEstab As Long dwInSegs As Long dwOutSegs As Long dwRetransSegs As Long dwInErrs As Long dwOutRsts As Long dwNumConns As Long End Type Declare Function GetTcpStatistics Lib "IPhlpAPI" _ (pStats As MIB_TCPSTATS) As Long Type MIB_UDPSTATS dwInDatagrams As Long dwNoPorts As Long dwInErrors As Long dwOutDatagrams As Long dwNumAddrs As Long End Type 55 Declare Function GetUdpStatistics Lib "IPhlpAPI" _ (pStats As MIB_UDPSTATS) As Long Function c_port(s) As Long On Error Resume Next c_port = Asc(Mid(s, 1, 1)) * 256 + Asc(Mid(s, 2, 1)) End Function Function c_ip(s) As String c_ip = Asc(Mid(s, 1, 1)) & "." & Asc(Mid(s, 2, 1)) & "." & Asc(Mid(s, 3, 1)) & "." & Asc(Mid(s, 4, 1)) End Function Function c_state(s) As String Select Case s Case MIB_TCP_STATE_CLOSED: c_state = "CLOSED" Case MIB_TCP_STATE_LISTEN: c_state = "LISTEN" Case MIB_TCP_STATE_SYN_SENT: c_state = "SYN_SENT" Case MIB_TCP_STATE_SYN_RCVD: c_state = "SYN_RCVD" Case MIB_TCP_STATE_ESTAB: c_state = "ESTAB" Case MIB_TCP_STATE_FIN_WAIT1: c_state = "FIN_WAIT1" Case MIB_TCP_STATE_FIN_WAIT2: c_state = "FIN_WAIT2" Case MIB_TCP_STATE_CLOSE_WAIT: c_state = "CLOSE_WAIT" Case MIB_TCP_STATE_CLOSING: c_state = "CLOSING" Case MIB_TCP_STATE_LAST_ACK: c_state = "LAST_ACK" Case MIB_TCP_STATE_TIME_WAIT: c_state = "TIME_WAIT" Case MIB_TCP_STATE_DELETE_TCB: c_state = "DELETE_TCB" Case Else: c_state = "UNDEFINED" End Select End Function 56 查看流量 Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function SetWindowRgn Lib "User32" (ByVal hwnd As Long, ByVal hrgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function ReleaseCapture Lib "User32" () As Long Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean Private Type NOTIFYICONDATA cbSize As Long mhWnd As Long uId As Long uFlags As Long ucallbackMessage As Long hIcon As Long szTip As String * 64 End Type Private Const NIM_ADD = &H0 Private Const NIM_MODIFY = &H1 Private Const NIM_DELETE = &H2 Private Const WM_MOUSEMOVE = &H200 Private Const NIF_MESSAGE = &H1 Private Const NIF_ICON = &H2 Private Const NIF_TIP = &H4 Private Const WM_LBUTTONDBLCLK = &H203 Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Private Const WM_RBUTTONDBLCLK = &H206 57 Private Const WM_RBUTTONDOWN = &H204 Private Const WM_RBUTTONUP = &H205 Dim TheForm As NOTIFYICONDATA Private Const WM_NCLBUTTONDOWN = &HA1 Private Const HTCAPTION = 2 Private m_objIpHelper As CIpHelper Private TransferRate As Single Private TransferRate2 As Single Private Sub Form_Activate() If MainOnTop = True Then SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE End If If MainOnTop = False Then SetWindowPos Me.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE End If End Sub Private Sub Image2_Click() FrmSettings.Show End Sub Private Sub Image3_Click() frmAbout.Show End Sub Private Sub Label11_Click() frmAbout.Show End Sub 58 Private Sub Label12_Click() FrmSettings.Show End Sub Private Sub Pic1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Static Rec As Boolean, Msg As Long Msg = X / Screen.TwipsPerPixelX If Rec = False Then Rec = True Select Case Msg Case WM_LBUTTONDBLCLK: FrmMain.Show Case WM_LBUTTONDOWN: Case WM_LBUTTONUP: Case WM_RBUTTONDBLCLK: Case WM_RBUTTONDOWN: Case WM_RBUTTONUP: PopupMenu FrmMenu.MenuFile End Select Rec = False End If End Sub Private Sub Timer1_Timer() On Error Resume Next Call UpdateInterfaceInfo End Sub Private Sub UpdateInterfaceInfo() On Error Resume Next 59 Dim objInterface As CInterface Static st_objInterface As CInterface Static lngBytesRecv As Double Static lngBytesSent As Double Dim blnIsRecv As Boolean Dim blnIsSent As Boolean If st_objInterface Is Nothing Then Set st_objInterface = New CInterface Set objInterface = m_objIpHelper.Interfaces(1) Select Case objInterface.InterfaceType Case MIB_IF_TYPE_ETHERNET: lblType.Caption = "累计信息" Case MIB_IF_TYPE_FDDI: lblType.Caption = "FDDI" Case MIB_IF_TYPE_LOOPBACK: lblType.Caption = "Loopback" Case MIB_IF_TYPE_OTHER: lblType.Caption = "Other" Case MIB_IF_TYPE_PPP: lblType.Caption = "PPP" Case MIB_IF_TYPE_SLIP: lblType.Caption = "SLIP" Case MIB_IF_TYPE_TOKENRING: lblType.Caption = "TokenRing" End Select lblRecv.Caption = Trim(Format(m_objIpHelper.BytesReceived / 1024, "###,###,###,###,##0")) lblSent.Caption = Trim(Format(m_objIpHelper.BytesSent / 1024, "###,###,###,###,##0")) Set st_objInterface = objInterface blnIsRecv = (m_objIpHelper.BytesReceived / 1024 > lngBytesRecv / 1024) blnIsSent = (m_objIpHelper.BytesSent / 1024 > lngBytesSent / 1024) If IconToUse = "icon1" Then If blnIsRecv And blnIsSent Then Pic1.Picture = ImageList1.ListImages(4).Picture Me.Icon = ImageList1.ListImages(4).Picture Image1.Picture = ImageList1.ListImages(4).Picture ElseIf (Not blnIsRecv) And blnIsSent Then Pic1.Picture = ImageList1.ListImages(2).Picture Me.Icon = ImageList1.ListImages(2).Picture Image1.Picture = ImageList1.ListImages(2).Picture ElseIf blnIsRecv And (Not blnIsSent) Then Pic1.Picture = ImageList1.ListImages(3).Picture Me.Icon = ImageList1.ListImages(3).Picture 60 Image1.Picture = ImageList1.ListImages(3).Picture ElseIf Not (blnIsRecv And blnIsSent) Then Pic1.Picture = ImageList1.ListImages(1).Picture Me.Icon = ImageList1.ListImages(1).Picture Image1.Picture = ImageList1.ListImages(1).Picture End If End If If IconToUse = "icon2" Then If blnIsRecv And blnIsSent Then Pic1.Picture = ImageList2.ListImages(4).Picture Me.Icon = ImageList2.ListImages(4).Picture Image1.Picture = ImageList2.ListImages(4).Picture ElseIf (Not blnIsRecv) And blnIsSent Then Pic1.Picture = ImageList2.ListImages(2).Picture Me.Icon = ImageList2.ListImages(2).Picture Image1.Picture = ImageList2.ListImages(2).Picture ElseIf blnIsRecv And (Not blnIsSent) Then Pic1.Picture = ImageList2.ListImages(3).Picture Me.Icon = ImageList2.ListImages(3).Picture Image1.Picture = ImageList2.ListImages(3).Picture ElseIf Not (blnIsRecv And blnIsSent) Then Pic1.Picture = ImageList2.ListImages(1).Picture Me.Icon = ImageList2.ListImages(1).Picture Image1.Picture = ImageList2.ListImages(1).Picture End If End If If IconToUse = "icon3" Then If blnIsRecv And blnIsSent Then Pic1.Picture = ImageList3.ListImages(4).Picture Me.Icon = ImageList3.ListImages(4).Picture Image1.Picture = ImageList3.ListImages(4).Picture ElseIf (Not blnIsRecv) And blnIsSent Then Pic1.Picture = ImageList3.ListImages(2).Picture Me.Icon = ImageList3.ListImages(2).Picture Image1.Picture = ImageList3.ListImages(2).Picture ElseIf blnIsRecv And (Not blnIsSent) Then 61 Pic1.Picture = ImageList3.ListImages(3).Picture Me.Icon = ImageList3.ListImages(3).Picture Image1.Picture = ImageList3.ListImages(3).Picture ElseIf Not (blnIsRecv And blnIsSent) Then Pic1.Picture = ImageList3.ListImages(1).Picture Me.Icon = ImageList3.ListImages(1).Picture Image1.Picture = ImageList3.ListImages(1).Picture End If End If If IconToUse = "icon4" Then If blnIsRecv And blnIsSent Then Pic1.Picture = ImageList4.ListImages(4).Picture Me.Icon = ImageList4.ListImages(4).Picture Image1.Picture = ImageList4.ListImages(4).Picture ElseIf (Not blnIsRecv) And blnIsSent Then Pic1.Picture = ImageList4.ListImages(2).Picture Me.Icon = ImageList4.ListImages(2).Picture Image1.Picture = ImageList4.ListImages(2).Picture ElseIf blnIsRecv And (Not blnIsSent) Then Pic1.Picture = ImageList4.ListImages(3).Picture Me.Icon = ImageList4.ListImages(3).Picture Image1.Picture = ImageList4.ListImages(3).Picture ElseIf Not (blnIsRecv And blnIsSent) Then Pic1.Picture = ImageList4.ListImages(1).Picture Me.Icon = ImageList4.ListImages(1).Picture Image1.Picture = ImageList4.ListImages(1).Picture End If End If If IconToUse = "icon5" Then If blnIsRecv And blnIsSent Then Pic1.Picture = ImageList5.ListImages(4).Picture Me.Icon = ImageList5.ListImages(4).Picture Image1.Picture = ImageList5.ListImages(4).Picture ElseIf (Not blnIsRecv) And blnIsSent Then Pic1.Picture = ImageList5.ListImages(2).Picture Me.Icon = ImageList5.ListImages(2).Picture 62 Image1.Picture = ImageList5.ListImages(2).Picture ElseIf blnIsRecv And (Not blnIsSent) Then Pic1.Picture = ImageList5.ListImages(3).Picture Me.Icon = ImageList5.ListImages(3).Picture Image1.Picture = ImageList5.ListImages(3).Picture ElseIf Not (blnIsRecv And blnIsSent) Then Pic1.Picture = ImageList5.ListImages(1).Picture Me.Icon = ImageList5.ListImages(1).Picture Image1.Picture = ImageList5.ListImages(1).Picture End If End If ModifyIcon lngBytesRecv = m_objIpHelper.BytesReceived lngBytesSent = m_objIpHelper.BytesSent DoEvents End Sub Private Sub Timer2_Timer() On Error Resume Next DoEvents Dim XX As Long Dim YY As Long Dim XXX As Long Dim YYY As Long YYY = Label6.Caption YY = Label5.Caption DoEvents XX = Me.lblRecv.Caption - YY XXX = Me.lblSent.Caption - YYY DoEvents TransferRate = Format(Int(XX), "00.00") DoEvents TransferRate2 = Format(Int(XXX), "00.00") DoEvents Label10.Caption = TransferRate2 & " KB" 63 DoEvents Label9.Caption = TransferRate & " KB" DoEvents DoEvents Label5.Caption = Me.lblRecv.Caption Label6.Caption = Me.lblSent.Caption DoEvents End Sub Public Sub DragForm(Frm As Form) On Local Error Resume Next Call ReleaseCapture Call SendMessage(Frm.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0) End Sub Private Sub btnBottomDown_Click(Index As Integer) FrmStats.WindowState = 0 If bBottomOut = True Then iRelBottomTrayOffset = FrmMain.Top Do While FrmStats.Top > iRelBottomTrayOffset FrmStats.Top = FrmStats.Top - 30 FrmMain.ZOrder DoEvents Loop FrmStats.Hide bBottomOut = False Exit Sub 64 End If DoEvents If bBottomOut = True Then Exit Sub FrmStats.Left = FrmMain.Left FrmStats.Top = FrmMain.Top FrmStats.Show Me.SetFocus DoEvents iRelBottomTrayOffset = FrmMain.Top + FrmMain.Height Do While FrmStats.Top < iRelBottomTrayOffset FrmStats.Top = FrmStats.Top + 15 FrmMain.ZOrder DoEvents Loop FrmStats.Top = FrmMain.Top + FrmMain.Height bBottomOut = True End Sub Private Sub Form_Load() If App.PrevInstance = True Then End End If DoEvents Dim CheckMainOnTop As String CheckMainOnTop = ReadINI("settings", "mainontop", App.Path & "\settings.ini") If CheckMainOnTop = "unchecked" Then MainOnTop = False End If If CheckMainOnTop = "checked" Then 65 MainOnTop = True End If Set m_objIpHelper = New CIpHelper bBottomOut = False Me.Height = 2745 Me.Width = 4560 IconToUse = ReadINI("settings", "icon", App.Path & "\settings.ini") Me.Top = Val(ReadINI("formposition", "maintop", QuickRef.UserINIFileName)) Me.Left = Val(ReadINI("formposition", "mainleft", QuickRef.UserINIFileName)) Me.Caption = "网络流量查看" lblCaption.Caption = "网络流量查看" Call LoadColors Call SetColors(Me) SysTray DoEvents If ReadINI("settings", "showmainform", App.Path & "\settings.ini") = "unchecked" Then Timer3.Enabled = True End If If ReadINI("settings", "showdesktopform", App.Path & "\settings.ini") = "checked" Then End If End Sub Private Sub Image3_MouseDown(Button As Integer, Shift As Integer, X 66 As Single, Y As Single) If Button = vbLeftButton Then Image3.Picture = Image4.Picture End If End Sub Private Sub Image3_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image3.Picture = Image7.Picture End If End Sub Private Sub imgClose_Click() Unload Me End Sub Private Sub imgClose_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then imgClose.Picture = Image5.Picture End If End Sub Private Sub imgClose_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then imgClose.Picture = Image8.Picture End If End Sub Private Sub imgMinimize_Click() On Error Resume Next Me.WindowState = vbMinimized FrmStats.WindowState = vbMinimized End Sub 67 Private Sub imgMinimize_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then imgMinimize.Picture = Image6.Picture End If End Sub Private Sub imgMinimize_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then imgMinimize.Picture = Image9.Picture End If End Sub Private Sub Label11_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image3.Picture = Image4.Picture End If End Sub Private Sub Label11_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image3.Picture = Image7.Picture End If End Sub Private Sub Label12_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image2.Picture = Image4.Picture End If End Sub 68 Private Sub Label12_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image2.Picture = Image7.Picture End If End Sub Private Sub Image2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image2.Picture = Image4.Picture End If End Sub Private Sub Image2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then Image2.Picture = Image7.Picture End If End Sub Private Sub btnBottomDown_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) btnBottomDown(1).Picture = btnBottomDown(2).Picture End Sub Public Function SysTray() TheForm.cbSize = Len(TheForm) TheForm.mhWnd = Pic1.hwnd TheForm.hIcon = Pic1.Picture TheForm.uId = 1& TheForm.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE TheForm.ucallbackMessage = WM_MOUSEMOVE TheForm.szTip = "网络流量查看" & App.Major & "." & App.Minor & 69 "." & App.Revision Shell_NotifyIcon NIM_ADD, TheForm End Function Function ModifyIcon() TheForm.cbSize = Len(TheForm) TheForm.mhWnd = Pic1.hwnd TheForm.hIcon = Pic1.Picture TheForm.uId = 1& TheForm.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE TheForm.ucallbackMessage = WM_MOUSEMOVE Shell_NotifyIcon NIM_MODIFY, TheForm End Function Public Sub CleanUpSystray() Shell_NotifyIcon NIM_DELETE, TheForm End Sub Private Sub Timer3_Timer() Me.Hide Timer3.Enabled = False End Sub Option Explicit Public Enum OperationalStates MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0 MIB_IF_OPER_STATUS_UNREACHABLE = 1 MIB_IF_OPER_STATUS_DISCONNECTED = 2 MIB_IF_OPER_STATUS_CONNECTING = 3 MIB_IF_OPER_STATUS_CONNECTED = 4 MIB_IF_OPER_STATUS_OPERATIONAL = 5 End Enum 70 Public Enum InterfaceTypes MIB_IF_TYPE_OTHER = 1 MIB_IF_TYPE_ETHERNET = 6 MIB_IF_TYPE_TOKENRING = 9 MIB_IF_TYPE_FDDI = 15 MIB_IF_TYPE_PPP = 23 MIB_IF_TYPE_LOOPBACK = 24 MIB_IF_TYPE_SLIP = 28 End Enum Public Enum AdminStatuses MIB_IF_ADMIN_STATUS_UP = 1 MIB_IF_ADMIN_STATUS_DOWN = 2 MIB_IF_ADMIN_STATUS_TESTING = 3 End Enum Private Const MAXLEN_IFDESCR = 256 Private Const MAXLEN_PHYSADDR = 8 Private Const MAX_INTERFACE_NAME_LEN = 256 Private Const ERROR_NOT_SUPPORTED = 50& Private Const ERROR_SUCCESS = 0& Private Type MIB_IFROW wszName(0 To 511) As Byte dwIndex As Long dwType As Long dwMtu As Long dwSpeed As Long dwPhysAddrLen As Long bPhysAddr(0 To 7) As Byte dwAdminStatus As Long dwOperStatus As Long dwLastChange As Long dwInOctets As Long dwInUcastPkts As Long dwInNUcastPkts As Long dwInDiscards As Long 71 dwInErrors As Long dwInUnknownProtos As Long dwOutOctets As Long dwOutUcastPkts As Long dwOutNUcastPkts As Long dwOutDiscards As Long dwOutErrors As Long dwOutQLen As Long dwDescrLen As Long bDescr(0 To 255) As Byte End Type Private Declare Function GetIfTable Lib "IPhlpAPI" (ByRef pIfRowTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef pDest As Any, ByRef pSource As Any, ByVal Length As Long) Private mvarInterfaces As CInterfaces Private m_lngBytesReceived As Long Private m_lngBytesSent As Long Public Property Set Interfaces(ByVal vData As CInterfaces) Set mvarInterfaces = vData End Property Public Property Get Interfaces() As CInterfaces' Set mvarInterfaces = Nothing Set mvarInterfaces = New CInterfaces Call InitInterfaces(mvarInterfaces)' Set Interfaces = mvarInterfaces' End Property Public Property Get BytesReceived() As Double BytesReceived = m_lngBytesReceived 72 End Property Public Property Get BytesSent() As Double BytesSent = m_lngBytesSent End Property Private Function InitInterfaces(objInterfaces As CInterfaces) As Boolean On Error Resume Next Dim arrBuffer() As Byte Dim lngSize As Long Dim lngRetVal As Long Dim lngRows As Long Dim i As Integer Dim j As Integer Dim IfRowTable As MIB_IFROW Dim objInterface As New CInterface lngSize = 0 m_lngBytesReceived = 0 m_lngBytesSent = 0 lngRetVal = GetIfTable(ByVal 0&, lngSize, 0) If lngRetVal = ERROR_NOT_SUPPORTED Then Exit Function End If ReDim arrBuffer(0 To lngSize - 1) As Byte lngRetVal = GetIfTable(arrBuffer(0), lngSize, 0) If lngRetVal = ERROR_SUCCESS Then CopyMemory lngRows, arrBuffer(0), 4 For i = 1 To lngRows CopyMemory IfRowTable, arrBuffer(4 + (i - 1) * Len(IfRowTable)),Len(IfRowTable) 73 With IfRowTable objInterface.InterfaceDescription=Left(StrConv(.bDescr,vbUnicode), .dwDescrLen) If .dwPhysAddrLen > 0 Then For j = 0 To .dwPhysAddrLen - 1 objInterface.AdapterAddress = objInterface.AdapterAddress & _ CStr(IIf(.bPhysAddr(j) = 0, "00", Hex(.bPhysAddr(j)))) & "-" Next j objInterface.AdapterAddress = Left(objInterface.AdapterAddress, Len(objInterface.AdapterAddress) - 1) End If objInterface.AdminStatus = .dwAdminStatus objInterface.InterfaceIndex = .dwIndex objInterface.DiscardedIncomingPackets = .dwInDiscards objInterface.IncomingErrors = .dwInErrors objInterface.NonunicastPacketsReceived = .dwInNUcastPkts objInterface.OctetsReceived = .dwInOctets objInterface.UnicastPacketsReceived = .dwInUcastPkts objInterface.UnknownProtocolPackets = .dwInUnknownProtos objInterface.LastChange = .dwLastChange objInterface.MaximumTransmissionUnit = .dwMtu objInterface.OperationalStatus = .dwOperStatus objInterface.DiscardedOutgoingPackets = .dwOutDiscards objInterface.OutgoingErrors = .dwOutErrors objInterface.NonunicastPacketsSent = .dwOutNUcastPkts objInterface.OctetsSent = .dwOutOctets 74 objInterface.OutputQueueLength = .dwOutQLen objInterface.UnicastPacketsSent = .dwOutUcastPkts objInterface.Speed = .dwSpeed objInterface.InterfaceType = .dwType objInterface.InterfaceName = StrConv(.wszName, vbUnicode) m_lngBytesReceived=m_lngBytesReceived+ .dwIn Octets m_lngBytesSent = m_lngBytesSent + .dwOutOctets End With mvarInterfaces.Add objInterface Next i End If End Function 75 参 考 文 献 [1] Black.TCP/IP及相关协议.北京机械工业出版社[M].1998 [2] Dave Plonka. FlowScan: A network traffic flow reporting and visualization tool [M]. In Proceedings of the 2000 USENIX LISA Conference, 2000 [3] 陈峰棋 .《Visual Basic网络编程从入门到精通》[M].中国铁道出 版社.2002 [4] Andrew Moore, James Hall, Euan Harris, Christian Kreibich, and Ian Pratt. Architecture of a network monitor [M]. In Proc. of the Fourth Passive and Active Measurement Workshop (PAM 2003), April 2003. [5] M. Polychronakis.Design of an Application Programming Interface for IP Network Monitoring [M]. April 2003. [6] 尉宏波 .Windows API编程范例入门与提高[M].北京:清华大学出 版社.2003 [7] 朱国华.Visual Basic语言教程[M].河南科学教育出版社. 2001 [8] 林永.Windows API编程手册[M].人民邮电出版社.2002 [9] Anthony Jones,Jim Ohlund.Network Programming for Microsoft Windows[M] . 清华大学出版社.2002 [10] Laura A.Chappell,Ed Tittel.TCP/IP协议原理与应用[M]. 清华 大学出版社.2005 [11] 鲁士文.计算机网络协议和实现技术[M].清华大学出版社.2000 [12] 网络协议大全[M].中国电力出版社.2001 [13] 郑岩峰,赵新娟.Internet技术与应用简明教程[M].清华大学出版 社.2005 [14] 张英,王景新.网络安全基础[M].中国电力出版社.2004 [15] Saadat Malik.Network Security Principles and Practices[M]. 人民 邮电出版社.2003 [16] 王睿,林海波.网络安全与防火墙技术[M].清华大学出版社.2000 [17] Gianluca Insolvibile. Kernel korner: The linux socket _lter: Snif_ng 76 bytes over the network [M].The Linux Journal, 86, June 2001. [18] R. Bace and P. Mell. Intrusion Detection Systems [M]. National Institute of Standards and Technology(NIST), Special Publication 800-31, 2001. [19] Chuck Fraleigh, Sue Moon, Christophe Diot, Bryan Lyles, and Fou ad Tobagi. Architecture of a Passive Monitoring System for IP Networks [M]. Technical Report TR00-ATL-101801, Sprint,2000. 77
/
本文档为【计算机网络连接监控系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索