《网络流量监控软件的设计与实现设计.doc》由会员分享,可在线阅读,更多相关《网络流量监控软件的设计与实现设计.doc(25页珍藏版)》请在三一办公上搜索。
1、网络流量监控软件的设计与实现设计长沙理工大学网络协议编程课程设计报告 网络流量监控软件的设计与实现xxx学 院 计算机与通信工程 专 业 网络工程 班 级 网络12-1 学 号 20125808* 学生姓名 xxxxxx 指导教师 xxxxx 课程成绩 完成日期 2015年9月25日课程设计成绩评定院 系 计算机与通信工程 专 业 网络工程 班 级 网络1201 学 号 xxxxxx 学生姓名 xxxxxx 指导教师 xxxxxx 指导教师对学生在课程设计中的评价评分项目优良中及格不及格学习态度与遵守纪律情况课程设计完成情况课程设计报告的质量指导教师成绩 指导教师签字 年 月 日课程设计答辩组
2、对学生在课程设计中的评价评分项目优良中及格不及格课程设计完成情况课程设计报告的质量课程设计答辩答辩组成绩 答辩组长签字 年 月 日课程设计综合成绩 注:课程设计综合成绩指导教师成绩60%答辩组成绩40%课程设计任务书计算机与通信工程学院 网络工程专业课程名称网络协议编程课程设计时间20152016学年第1学期34周学生姓名xxxxxx指导老师xxxxxx题 目网络流量监控软件的设计与实现主要内容:(1) 可以监控网络实时监控网络流量,同时利用图像分析显示网络流量大小,并将结果写入日志文件。(2) 显示内容包括:网络输入流量,网络输出流量,接口名称,总流量以及流量统计图等内容。(3) 设置停止标
3、志,当程序接受到停止命令时即停止。要求:(1) 结合网络协议编程课程设计所学知识设计并实现网络流量监控软件的设计与实现。(2) 学会文献检索的基本方法和综合运用文献的能力。(3) 通过课程设计培养严谨的科学态度,认真的工作作风和团队协作精神。应当提交的文件:(1) 课程设计学年论文。(2) 课程设计附件(相关图纸、设备配置清单、报告等)。网络流量监控软件的设计与实现学生姓名:xxxxxx 指导老师:xxxxxx摘 要 互联网迅速发展的同时,网络安全问题日益成为人们关注的焦点,病毒、恶意攻击、非法访问等都容易影响网络的正常运行,多种网络防御技术被综合应用到网络安全管理体系中,流量监控系统便是其中
4、一种分析网络状况的有效方法,它从数据包流量分析角度,通过实时地收集和监视网络数据包信息,来检查是否有违反安全策略的行为和网络工作异常的迹象。 在研究网络数据包捕获、 TCP/IP原理的基础上,采用面向对象的方法进行了需求分析与功能设计。该系统在VisualC+6.0环境下进行开发,综合采用了 Socket-Raw、注册表编程和IP助手API等VC编程技术,在系统需求分析的基础上,对主要功能的实现方案和技术细节进行了详细分析与设计,并通过测试,最终实现了数据包捕获、流量监视与统计主要功能,达到了预定要求,为网络管理员了解网络运行状态提供了参考。关键词 网络管理;数据采集;流量统计;Winsock
5、2The Design and Implementation of Monitoring and Analyzing Tool for Network Traffic Student name: xxxxxxAdvisor:xxxxxxAbstract WiththerapiddevelopmentofInternet,networksafetyhasbecomepeoplesconcern,virus,vigorousattack,illegalvisitandsooncaneasilyaffectthenormalnetworkperformance.Variouskindsofnetwo
6、rkdefendingtechnologyhavebeencomprehensivelyappliedintothemanagementsystemofnetworksafety.Networktrafficsystemisoneoftheeffectivemeasurestoanalysisnetworkcondition.Fromtheangleofanalyzingpackettraffic,itcanexaminethesafetyviolationandtheabnormalperformanceofnetworkbytimelycollectingandmonitoringpack
7、etsinformation.Byusingthewayofobject-oriented,thisdesignmakesaneedsanalysisandabilitydesigningbasedonthestudyofnetworkpacketcollectingandTCP/IPtheory.UndertheenvironmentofVisualC+6.0,thissystemadoptsVCprogramtechnologiesofSocket-Raw,WindowsregisterandIpHelperAPI.Onthebasisofsystemanalysis,itmakesade
8、liberateanalysisandtestofplansanddetailstoimplementpacketscollecting,trafficmonitoringandstatistics.Sothismeetsourneedsandmakesareferenceformanagerstogettoknowthenetworkconditions.Key words network management; data collection; traffic analysis; Winsock21 引言1.1 背景 随着构建网络基础技术和网络应用的迅速发展以及用户对网络性能要求的提高,使
9、得网络管理成为迫切需要解决的问题,有效的网络管理能够保证网络的稳定运行和持续发展,更重要的是,随着网络规模的扩大和黑客技术的发展,入侵和攻击的案例日益增多,对稳定的网络服务、信息安全、互联网秩序都提出了严峻的挑战,网络安全管理在整个网络管理系统里扮演起更为重要的角色。1.2 网络流量监控的引入 络安全管理体系中,流量监控和统计分析是整个管理的基础。 流量检测主要目的是通过对网络数据进行实时连续的采集监测网络流量,对获得的流量数据进行统计计算,从而得到网络主要成分的性能指标。网络管理员根据流量数据就可以对网络主要成分进行性能分析管理,发现性能变化趋势,并分析出影响网络性能的因素及问题所在。此外,
10、在网络流量异常的情况下,通过扩展的流量检测报警系统还可以向管理人员报警,及时发现故障加以处理。在网络流量检测的基础上,管理员还可对感兴趣的网络管理对象设置审查值范围及配置网络性能对象,监控实时轮询网络获取定义对象的当前值,若超出审查值的正常预定值则报警,协助管理员发现网络瓶颈,这样就能实现一定程度上的故障管理。而网络流量检测本身也涉及到安全管理方面的内容。 由此可见,对于一个有效的网络安全管理系统来说,功能的实现都或多或少的依赖于流量信息的获取。因此网络流量信息的采集可以说是网络安全管理系统得以实现的核心基石。它的应用可以在一定程度上检测到入侵攻击,可以有效地帮助管理人员进行网络性能管理,并利
11、用报警机制协助网管人员采取对应的安全策略与防护措施,从而减少入侵攻击所造成的损失。1.3 论文结构安排 本论文围绕Winsock标准套接字网络编程的各项实践内容展开。具体内容安排如下:第一章是引言,简要介绍开发背景、论文结构安排;第二章介绍数据包捕获与流量检测的技术原理;第三章重点介绍网络流量监测工具的设计与实现过程,并且详细阐述了从系统功能总体设计、详细设计、具体实现的全部过程。2. 网络数据采集技术的分析2.1 OSI参考模型与TCP/IP体系结构开放系统互联参考模型OSI是由国际标准化组织ISO制定的标准化开放式的计算机网络层次结构模型,其结构如图1所示。可以看出,该结构共有七层,各层主
12、要实现如下功能:(1)物理层,利用传输介质实现相邻节点间的物理连接,主要对机械、电气、功能和规程四个方面及信号传输速率方面进行规定;(2)数据链路层,完成管理数据的传输,提供差错检测和恢复,并且提供流量控制,最终实现向上一层提供无差错、高可靠性的传输链路;(3)网络层,执行路由算法和流量控制算法,完成数据分组传输,它是通信子网的最高层;(4)传输层,提供端到端的无差错传输,同时,它也提供属于局通信网络接口,比如SOCKET;(5)会话层,完成用户之间会话的组织、协调、分配用户名等;(6)表示层,解决数据格式问题,规定编码方式;(7)应用层,OSI的最高层,利用应用进程提供网络访问手段。如图2.
13、1所示:图1 OSI参考模型 2.2 TCP/IP体系结构由于TCP/IP比其之前的OSI模型更具体实现,随着互联网的不断发展,遵循TCP/IP结构的网络不断普及,因此现在通常采用TCP/IP代表Internet体系结构。TCP/IP的目的是在网络标准不同的情况下解决互联问题,可以说,网络互联是TCP/IP的核心。TCP/IP的体系结构如图2.2所示:图2.2 OSI参考模型与TCP/IP结构TCP/IP在设计时重点并没有放在具体通信的实现上,所以对最后两层没有做出具体规定,同时表明它允许不同类型的通信网络参与通信。它的四个层次功能如下。(1)应用层,提供常用的应用程序及自定义的应用程序,数据
14、传输时用TCP/IP协议来进行;(2)传输层,提供端到端的应用程序之间的通信,可以使用传输控制协议TCP(Transmission Control Protocol)或用户数据报协议UDP(User Datagram Protocol)协议,前者提供可靠传输,传送单位是报文段,后者提供不可靠服务,传输单位是数据报,即分组。此外,传输层另外一个功能就是区别应用程序;(3)网际层,负责计算机之间的通信,采用的协议是IP协议,数据传送单位是分组,向上提供不可靠的传输服务;(4)网络接口层,负责接收数据报,并实现发送,或者接收帧,提取IP数据报,交给互联网层。2.3 OSI模型与TCP/IP体系结构的
15、区别从前面的分析可以看出OSI模型和TCP/IP体系有许多不同之处,主要体现在问题的处理上面,例如:(1)TCP/IP一开始就考虑的是异构网络的互联问题,并将IP看作是整个体系的重要组成部分,而ISO并没有认识到网际协议IP的重要性,导致最后只能单独划分一个子层来完成IP的作用;(2)OSI最开始只注意到了面向连接的服务,而TCP/IP一开始就注意了面向连接和无连接的并重。相比起来,TCP/IP更注重了数据传输的效率,而OSI则注重了传输的可靠性;(4)TCP/IP虽然分层,但是调用关系并不像OSI那样严格,减少了不必要的开销,提高了传输效率。2.4 原始数据报捕获的实现 网络上的数据包捕获机
16、制主要依赖于所使用的操作系统,不同的操作系统下有不同的实现途径。在Windows环境下,可通过网络驱动程序接口规范(NDIS),WinSock的SOCK_RAW或虚拟设备驱动技术(VxD)等技术实现网络数据包的捕获功能。 前面已经介绍到了,使用原始套接字可以绕过Socket提供的功能,对底层的协议进行使用与开发,可以根据自己的需要生成想要的数据报文等,下面开始介绍使用原始套接字对数据包捕获进行开发的相关技术知识。 第一,使用套接字前,需要了解网卡接收数据的工作原理: 在正常情况下,网络接口只响应两种数据帧,一种是与自己的硬件相匹配的数据帧,另一种四向所有计算机广播的数据帧。在系统中,数据帧的收
17、发由网卡完成,网卡程序接收从网络发来的数据包,根据其硬件地址去判断是否与本机的硬件地址匹配,若匹配就通知CPU产生中断进行响应,然后调用驱动程序设置的网卡中断程序地址调用驱动程序接收数据,然后放入堆栈进行系统相关处理,若不匹配则直接丢弃该数据包。对于网络接口,它一般具有4种数据接收模式:广播、组播、直接和混杂模式,只有当把接口设置为混杂模式时,网络接口才能接收所有的数据,无论地址是否匹配,所以在做本设计的时候一定要设置为混杂模式才能实现数据的采集。 第二,需要了解套接字的工作程序和使用方法: 一般来说,采用套接字开发网络程序需要经历以下几个基本步骤: 启动、创建、绑定、监听(接受连接)、连接、
18、发送/接收数据、关闭、卸载等。 第三,具体到Windows下利用原始套接字捕获网络数据可以这样设计:(1)启动套接字;(2)创建一个原始套接字; (3)将套接字与本地地址绑定;(4)设置操作参数;(5)设置网络接口为混杂模式;(6)启动监听线程,开始接收数据;(7)退出关闭套接字。2.5 原始数据包捕获的关键函数 (1)启动函数WSAStartup int PASCAL FAR WSAStartup (DWORD wVersionRequested , LPWSADATA lpWSAData); 每一个套接字应用程序都必须调用该函数进行一系列初始化工作,并且只有调用成功返回后,才能开始使用套接
19、字,其中参数wVersionRequested是版本号,高字节是次版本号、低字节是主版本号,参数lpWSAData是指向WSADATA结构的指针。 (2)套接字创建函数socket SOCKET socket (int af , int type , int protocol); 所有的通信在建立之前都必须创建一个套接字,socket函数的功能就是创建套接字,其中参数af指协议地址族(address family),当建立的套接字是依赖于UDP或TCP的话,需要设置af为AF_INET,表示采用IP协议。参数type是指协议的套接字类型,采用流式套接字时用SOCK_STREAM,采用数据报套接
20、字时用SOCK_DGRAM,采用原始套接字时用SOCK_RAW。参数protocol是协议字段,默认情况下可直接设置为0。 3网络流量监控系统各模块的设计与实现3.1 开发环境介绍本设计开发平台采用Microsoft Visualstudio 6.0,它是目前使用比较广泛的Winsock开发平台,因此具有较强的适应性,能够在很多的操作系统平台上运行,设计后具有直观的简洁的操作界面,稳定性也比较高。3.2 总体结构设计通过收集与分析简单网络流量监控软件的用户需求,总结出以下特征:(1)需要实现对网络接口数据包的尽可能多的捕获,将网卡设置为混杂模式,然后进行数据包的采集;(2)数据包的内容要进行一
21、定的解析,对数据包的协议类型、源目地址、数据包截获时间、数据包内容需要进行分析;(3)根据用户不同的要求能够依照特定地址范围、特定协议类型相关包等条件进行自定义监视;(4)监视结果输出有实时流量图、列表等显示;(5)实现日志记录,便于日后分析;(6)对某些常见的攻击进行发现分析。总合以上系统要求与综合分析,本系统总体设计如下,采用VC+6.0编写,系统具有三个主要功能部分:数据捕获与显示模块、流量信息统计模块、流量绘制模块,如图3.1所示。流量监控分析系统数据采集模块信息统计模块流量绘制模块图 3.1 系统总体设计结构图数据采集模块:完成网络接口数据的捕获、解析和显示,可以根据用户定义条件组合
22、来进行捕获,如只监视采用TCP或UDP协议的数据包,也可以监视用户希望关注的相关IP地址的数据包,同时完成数据封包日志记录,提高了系统的灵活性。同时,在对数据包的解析过程中对一些常见入侵攻击特征进行判断,发出预警。该模块采用编写原始套接字开发。信息统计模块:完成统计功能,如统计IP要实现统计接收到的数据报数量、接收到的数据中协议出错的数量、正在请求传输的数量、路由表中可用路由数量、丢弃的数量、需要重组/成功重组的数量等,统计ICMP需要完成发送/接收的消息数量、满足超过TTL的数量、重定向数量、时间戳请求/应答数量等;采用IP助手函数完成。流量绘制模块:完成总流量、输入流量、输出流量、瞬时流量
23、值、最高流量值的显示;采用访问注册表网络性能数据完成有关数据的获取,通过流量图显示。3.3 流程图设计 本系统总体设计如下,采用VC+6.0编写,系统具有三个主要功能部分:数据捕获与显示模块、流量信息统计模块、流量绘制模块。根据上面对各个功能模块的划分,进行更进一步的分析和设计,得到数据采集、注册表网络性能块访问大致的工作流程图,如图3.2所示: 图3.2 数据捕获流程图3.4代码分析(1)功能实现说明 该功能模块主要由封装的CSockSupport,CsockHelper ,CpackInterDlg,CbinDataDlg四个类完成,下面将对这些类进行详细说明。 CsockSupport类
24、:主要负责检查Socket是否支持2.0版本,在该类中封装了WSAStartup完成Socket的启动; CsockHelper类:主要实现了从获取本机信息结构、Socket创建、绑定、设置、启动线程、数据接收到协议分析的全部方法。 GetLocalIP实现获取本机地址操作的方法,LPHOSTENT lphp是定义一个主机信息结构,获取过程由 gethostname(szLocname,MAX_HOSTNAME_LAN)与 gethostbyname(szLocname)完成;第一个参数是用于放置本机名称的缓冲,第二个参数是缓冲区长度,最后利用inet_ntoa将IP地址转化为“.”式地址。
25、StartCapture方法完成套接字的创建、绑定、设置操作方式和启动线程;具体完成如下: m_sockCap = socket(AF_INET , SOCK_RAW , IPPROTO_IP);/创建套接字 bind(m_sockCap, (PSOCKADDR)&sa, sizeof(sa);/绑定 setsockopt(m_sockCap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt) /设置操作 setsockopt(m_sockCap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(
26、bopt) /设置操作 m_hCapThread = CreateThread(NULL, 0, CaptureThread, this, 0, NULL);/启动线程 线程函数CaptureThread主要完成数据的接收。数据接收后,将缓冲区数据转化为IP数据格式后即可以开始解析过程,协议名称获取如下: for(int i=0; ih_lenver & 0xf) /获取数据包长度 协议解析: switch(iProtocol) case IPPROTO_TCP : case IPPROTO_UDP : case IPPROTO_ICMP : default : StopCapture完成关闭
27、线程和套接字操作: if(m_hCapThread) TerminateThread(m_hCapThread, 0); /中断进程 CloseHandle(m_hCapThread); /关闭句柄 m_hCapThread = NULL; if(m_sockCap) closesocket(m_sockCap); /关闭套接字 CbinDataDlg类主要完成对已捕获数据的存储和显示方法;(2)数据包采集中各类的关系经过上面的分析与设计,得到该系统的总体功能结构、工作流程,也确定了从编写套接字到最后捕获数据,要经过创建、绑定、设置工作模式、启动线程、接收数据等一系列的处理操作。为了实现处理中
28、的每一步操作,设计了数据捕获的类关系,如图3.3所示。图 3.3数据包采集中各类的关系在上图中CSockSupport,CSockHelper ,CPackInterDlg,CBinDataDlg等是封装了各部分主要处理功能的类。且这些类中封装了和这些类的操作相关的方法。将在后面对这些类的功能和实现进行详细介绍。 3.5 结果显示初始界面如图3.4所示:图3.4流量监控软件的界面 当单击鼠标右键时,会显示接口名称以及监控期间的总流量,如图3.5所示图3.5接口选择以及总流量统计4.结束语互联网的迅猛发展,流量检测和统计分析成为整个网络安全管理系统的基础部分。网络管理员可以根据数据流量的变化规律
29、,发现网络故障与攻击行为,及时采取措施,减少损失。 网络流量分析系统是一个比较复杂的系统,由于时间关系,本设计只完成了大概框架,通过编写套接字、访问注册表等方法实现了部分主要功能,并没有完全完成详细指标,比如只提供了局域网内流量实时监测、数据包解析、简单统计等功能,这些都有待于进一步改进、深入与完善,下一步工作的重点将是提供更多监控功能,对网络行为进行更深入的分析。 在整个设计过程中,重点放在了数据捕获与流量实时监控两个功能上,进而描述了采用套接字开发流量监控系统中的思路和关键事项,阐述了开发过程中碰到的一些技术问题,对功能需求与细节实现进行了详细分析与设计。参考文献1 陈伯成,范闽,李英杰.
30、 利用网络监听维护子网系统安全的一种方法J.计算机工程与 应用.2000,(10):133-135。 2 李凌. Winsock网络编程实用教程M. 北京:清华大学出版社,2003.11:9-35。3 曹衍龙,刘海英. Visual C+网络通信编程实用案例精选(第二版)M. 北京:人民 邮电出版社,2006.5:425-437。 4 孙贤淑. IP网络流量测量的研究与应用D. 北京:北京邮电大学硕士论文, 2005。5 许勇,吴忠堂. 网络流量采集与分析系统中数据采集的研究与实现D. 广州:华南理 工大学硕士论文, 2004。附录:#include stdafx.h#include NetT
31、rafficButton.h#include NetTrafficButtonDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ 自身的一个指针,这是为回调函数服务的CNetTrafficButtonDlg* me;/ 记录选择的接口号int SelectedInterface;/ 一个回调函数void CALLBACK interfaceHasChanged(int interfacenumber);class CAboutDlg : public CDia
32、logpublic:CAboutDlg();/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA /AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/AFX_VIRTUALprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)
33、/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ Keine Nachrichten-Handler/AFX_MSG_MAPEND_MESSAGE_MAP()/ CNetTrafficButtonDlg DialogfieldCNetTrafficButtonDlg:C
34、NetTrafficButtonDlg(CWnd* pParent /*=NULL*/): CDialog(CNetTrafficButtonDlg:IDD, pParent)/AFX_DATA_INIT(CNetTrafficButtonDlg)/AFX_DATA_INITm_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); /为回调函数服务的me = this;void CNetTrafficButtonDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DAT
35、A_MAP(CNetTrafficButtonDlg)DDX_Control(pDX, IDC_BUTTON3, m_cOutgoing);DDX_Control(pDX, IDC_BUTTON2, m_cIncoming);DDX_Control(pDX, IDC_BUTTON1, m_cTotalTraffic);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CNetTrafficButtonDlg, CDialog)/AFX_MSG_MAP(CNetTrafficButtonDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRA
36、GICON()ON_BN_CLICKED(IDC_BUTTON4, OnAbout)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CNetTrafficButtonDlg Message handlerBOOL CNetTrafficButtonDlg:OnInitDialog()CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_A
37、BOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);/ 使用第一个发现的网络连接int SelectedInterface= 0;/ 每秒钟刷新一次网络状态UINT timerresolution= 1000;/ To fake the Taskmanager.UINT gridresolution= 100;/ 监视的接口m_cTotalTraffic.SetInterfaceNumber(SelectedInterface);/ 这个button关注的时总流量m_cTotalTraffic.Select
38、TrafficType(MFTrafficButton:Traffic_Total);/ 设置得到通知的回调函数m_cTotalTraffic.SetInterfaceNumberNotificationFunction(interfaceHasChanged);/设置更新速率m_cTotalTraffic.SetUpdateSpeed(timerresolution, gridresolution); m_cOutgoing.SetInterfaceNumber(SelectedInterface);m_cOutgoing.SelectTrafficType(MFTrafficButton:
39、Traffic_Outgoing);m_cOutgoing.SetInterfaceNumberNotificationFunction(interfaceHasChanged);m_cOutgoing.SetUpdateSpeed(timerresolution, gridresolution); m_cIncoming.SetInterfaceNumber(SelectedInterface);m_cIncoming.SelectTrafficType(MFTrafficButton:Traffic_Incoming);m_cIncoming.SetInterfaceNumberNotif
40、icationFunction(interfaceHasChanged);m_cIncoming.SetUpdateSpeed(timerresolution, gridresolution); return TRUE; void CNetTrafficButtonDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CNetTrafficB
41、uttonDlg:OnPaint() if (IsIconic()CPaintDC dc(this); SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon +
42、 1) / 2; dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CNetTrafficButtonDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;/回调函数void CALLBACK interfaceHasChanged(int interfacenumber)SelectedInterface = interfacenumber; CString text;text.Format(NetTrafficButton using Interface: %d,SelectedInterface);me-SetWindowText(text);