网络的虚拟实验平台设计与实现毕业设计论文.doc
毕业设计(论文)基于网络的虚拟实验平台-动态升级模块的设计与实现论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:基于网络的虚拟实验平台-动态升级模块的设计与实现摘 要为优化学校虚拟实验平台功能,以其网络化改进方向为目标,设计与实现虚拟实验平台的动态升级模块。现有的虚拟实验平台不具有任何网络功能,所能进行的实验内容也相当有限,更重要的是实验内容的更新也是一大问题。该动态升级模块以现有的虚拟实验平台程序为基础,通过向目标主机查询是否拥有本机所没有的实验内容,如有则由用户决定是否下载,另外查询目标主机实验内容的版本号,与本机版本相比较,判断是否为新版本的实验内容,最后由用户决定是否更新。关键词:虚拟实验平台;版本;动态升级。The Virtual Experimental Platform based on the Network-The Design and Realization of the Dynamic Update ModuleAbstractIn order to optimize the function of the virtual experimentation platform and with the aim of its network amelioration, we design and realize the dynamic update module of the virtual experimentation platform. The experimentation platform which we already provided with dont have any network function and it has few of the experiment we need, besides the update of the experimentation platform is the most important problem. This dynamic update module is based on the program of the dummy experimentation we already provided with, we search the host computer whether has the experiment we dont have and decide to download the new experimentation or not by the user. On the other side, we search the version of the experiment of the host computer, compare with the version we already provided with and decide to update or not.Key words: virtual experimental platform; version; dynamic update.目录论文总页数:18页1 引言11.1课题背景11.2 本课题的研究意义11.3 本课题的研究方法12系统构成12.1系统概要12.2系统模块22.3项目要求23 开发工具及背景23.1Visual C+ 6.023.2网络基础知识23.2.1OSI参考模型23.2.2TCP/IP参考模型43.3C/S结构工作过程53.4C/S结软件自动更新的背景64虚拟实验平台动态升级模块的设计与实现74.1界面设计74.2程序执行流程图74.3主要步骤及具体实现方案84.3.1查询服务器端信息84.3.2比较新旧版本94.3.3获得升级程序文件的路径114.3.4获得文件升级后的保存路径114.3.5从服务器下载文件并保存到本地114.3.6关于如何保存当前版本号的问题135程序测试过程及结果145.1老版-新版本成功升级145.2版本无需更新15结 论16参考文献16致 谢17声 明181 引言1.1课题背景为优化学校虚拟实验平台功能,以其网络化改进方向为目标,设计与实现虚拟实验平台的动态升级模块。现有的虚拟实验平台不具有任何网络功能,所能进行的实验内容也相当有限,所以实验内容的更新是一大问题。现需要在现有的虚拟实验平台程序的基础上,设计并实现其动态升级模块。该模块通过向目标主机查询实验内容的版本号,与本机实验的版本号相比较,判断是否为新版本的实验内容,最后实现实验的版本更新。1.2 本课题的研究意义当前,升级功能作为大多数软件延长其生命周期必不可少的手段,为了赋予实验平台功能的可更新性,增强实验平台的灵活性,赋予其网络功能有着极为重要的意义。本设计的主要目的是为了检查使学生综合运用以前所学知识(包括以前所学的一些关于网络技术、编程技术、网络与信息安全等知识)的能力,设计开发一个软件升级模块;既锻炼了学生的实际动手能力,又引导学生进行了一次模拟实际产品的开发,对于学生以后工作能力的培养具有重要的意义。1.3 本课题的研究方法本题目要求设计开发一个功能较完善的软件升级模块。因此,本次毕业设计应首先分析软件升级的相关功能,结合本次毕业设计的相关要求写出需求分析;其次,综合运用以前所学的相关知识,选用Visual C+进行本毕业设计的开发;在设计中重点以需求分析为基础,写出系统开发计划、实现流程及相关问题的实现方法;同时,在开发设计与实现中,要保存好相关的设计文挡,为后面的毕业论文的写作准备材料;最后,系统开发完毕后,进行调试和试运行,做好调试和试运行的相关记录,也为后面的毕业论文的写作准备材料。2 系统构成2.1 系统概要虚拟实验平台是成都信息工程学院单片机与接口等相关实验课程中使用的一款微机实验仿真实验系统。主要具有以下功能和特点:1仿真8255、8253和基本I/O接口电路等;2虚拟常用外围单元电路,包括指示灯、数码管、传感器、交通、霓虹灯等,虚拟平台可同时使用;3提供了典型实验项目的参考实例和实验教学,还可完成相关的课程设计。虚拟实验就是利用外部输入(如鼠标的点击、拖动和键盘的敲击等),将计算机上虚拟的各种仪器,按实验要求、过程,组装成一个完整的实验环境,同时在这个环境中完成实验操作,包括实验器材的添加、实验条件的改变、数据采集以及实验结果的模拟、分析。它包含了虚拟仿真技术、计算机技术、实验技术、网络技术与专业等多方面理论知识。2.2 系统模块该虚拟实验平台现有五个方向的网络化改进模块:1VLP2P通信逻辑模块;2动态升级模块;3远程指导演示模块;4远程协作模块;5教师管理模块;本人完成的是动态升级模块。2.3 项目要求完成动态升级的基本功能,通过查询目标主机实验内容的版本号,与本机版本相比较,判断是否为新版本的实验内容,最后实现实验的版本更新。3 开发工具及背景3.1 Visual C+ 6.0Visual C+6.0 是微软98 年推出的产品,它提供了强大的编译能力以及良好的界面操作性。能够对Windows 9x、Windows NT 以及Windows 2000 下的C+程序设计提供完善的编程环境。同时Visual C+6.0 对网络、数据库等方面的编程也都提供相应的环境支持。3.2 网络基础知识3.2.1 OSI参考模型国际标准化组织(ISO)开发了开放式系统互联(OSI)参考模型,以促进计算机系统的开放互联。开放式互联就是可在多个厂家的环境中支持互联。该模型为计算机间开放式通信所需要定义的功能层次建立了全球标准。OSI模型将通信会话需要的各种进程划分成7个相对独立的功能层次,这些层次的组织是以在一个通信会话中事件发生的自然顺序为基础的。图1描述了OSI, 1-3层提供了网络访问,4-7层用于支持端端通信。1物理层7物理层是OSI模型的最低层,它建立在物理通信介质的基础上,规定了机械的、电气的功能;该层负责建立、保持和拆除物理链路;规定如何在此链路上传送原始比特流;比特如何编码,使用的电平,极性,连接插头插座的插脚如何分配等。所以在物理层数据的传送单位是比特(bit)。0SI参考模型层次描述OSI 层次号应用层7表示层6会话层5传输层4网络层3数据链路层2物理层1 图1- OSI参考模型2数据链路层它把相邻两个节点间不可靠的物理链路变成可靠的无差错的逻辑链路,包括把原始比特流分帧(frame)、顺序、排序、设置检错、确认、重发、流控等功能;数据链路层传动信息的单位是frame,每帧(frame)包括一定数量的数据和一些必要的控制信息,在每帧(frame)的控制信息中,包括同步信息、地址信息、流量信息等;同物理层相似,数据链路层负责建立、维护和释放数据链路。3网络层,它连接网络中任何两个计算机点,从一个节点上接收数据,正确的传送到另一个节点;在网络层,传送的信息单位是分组或包(packet)。网络层的主要任务是要选择合适的路由和交换节点,透明地向目的站交付发送站所发的分组或包,这里的透明表示收发两端好像是直接连通的,另外网络层还要解决网络互连、拥挤控制等问题。上述三层组成了所谓的通信子网,用户计算机连接到此子网上。通信子网负责把一个地方的数据可靠地传送到另一个地方,但并未实现两个地方主机上进行进程之间的通信,通信子网的主要功能是面向通信的。4传输层上真正地实现了端对端间通信,把数据可靠地从一方的用户进程或程序送到另一方的用户进程或程序。这一层的控制通常由通信两端的计算机完成。中间节点一般不提供这一层的服务,这一层的通信与通信子网无关。从这一层开始的以上各层全部是针对通信的最终的源端目的端计算机的进程之间的。传输层传送的信息单位是报文(message)。传输层向上一层提供一个可靠的端一端服务,使上一层看不见下面几层的通信细节。正因为如此,传输层成为网络体系结构中关键的一层,对于传输层的功能,主要在主机内实现。而对于物理层、数据链路层以及网络层的功能均能在报文接口机中实现。对于传输层之上的各个层次的功能通常在主机中实现。5会话层又称对话层会话层允许两个计算机上的用户进程建立对话连接,双方相互确认身份,协商对话连接的细节;它可管理对话是双向同时进行的,还是任何时刻只能一个方向进行。在后一种情况下,对话层控制哪一方有权发送数据;对话层还提供同步机制,在数据流中插入同步点机制,在每次网络出现故障后可以仅重传最近一个同步点以后的数据,而不必从头开始。以上两层为两个计算机上的用户进程或程序之间提供了正确传送数据的手段。6表示层主要解决用户信息的语法表示问题。表示层将数据从适合于某一系统的语法转变为适合于OSI系统内部使用的语法。具体地讲,表示层对传送的用户数据进行翻译、编码和变换,使得不同类型的机器对数据信息的不同表示方法可以相互理解。7应用层主要处理资源可用性和安全问题,它包含了大量人们普遍需要的协议,如FTP、TELNET、HTTP、SMTP等。最近几年,应用层协议发展很快,出现了很多新的应用,如ICQ、Multimedia stream等。3.2.2 TCP/IP参考模型TCP/IP使跨平台,或称为异构的网络互联成为可能。由图2我们可以看到,TCP/IP与OSI参考模型不同,TCP/IP模型更侧重于互联设备间的数据传送,而不是严格的功能层次划分。它通过解释功能层次分布的重要性来做到这点,但仍为设计者具体实现协议留下很大的余地。因此,OSI参考模型在解释互联网络通信机制比较适合,但TCP/IP成为了互联网络协议的市场标准。TCP/IP参老-模型是在它所解释的协议出现很久以后才发展起来的,更重要的是,在于它更强调功能分布而不是严格的功能层次的划分,因此它比OSI模型更灵活。TCP/IP参考模型层次描述TCP/IP层次号 应用层4传输层3网络层2数据链路层1图2- TCP/IP参考模型1应用层: 应用层包括SMTP, FTP, HTTP, NFS, NIS, LPD, Telnet f II Remote Login应用层包括一些服务,这些服务在OSI中由独立的三层实现。这些服务是和端户相关的认证、数据处理以及压缩。包括电子邮件、浏览器、Telnet以及其他的Internet应用。 2传输层: 传输层包括TCP ( Transport Control Protocol,传输控制协议)和UDP (User Datagram Protocol,用户数据报协议)。UDP几乎不进行检查,而TCP提供传输保证。与OSI中传输层不一样,TCP不保证报文的准确传输。TCP为两台主机提供高可靠性的数据通信。而另一方面,UDP则为应用层提供一种非常简单的服务,它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 3网络层: TCP/IP协议族中,网络层由以下协议组成:ICMP (Internet r联网托制报文协议)、IP(网际协议)、IGMP (Internet组管理协议)、RIP, OSPF和月j -t几路由的EGPo网络层处理报文的路由管理。 4链路层:链路层包括ARP和RARP,负责报文传输;链路层管理网络的连接并提供网络上的报文输入/输出。3.3 C/S结构工作过程C/S结构,全称Client/Server(客户端/服务器)结构,通过将任务合理分配到Client 端和Server 端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势,在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网之间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。客户机/服务器模式在操作过程中采取的是主动请求的方式。首先服务器方要先启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。等待客户请求到达该端口。接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程) 处理此客户请求,并不需要对其它请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。返回第二步,等待另一客户请求。关闭服务器:客户方:打开一个通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求报文,等待并接收应答;继续提出请求。请求结束后关闭通信通道并终止。3.4 C/S结软件自动更新的背景自动升级软件是一个独立的应用程序(单独的可执行文件例如MyUpdate.exe),供软件开发者编写代码,以外部程序的方式运行,例如调用ShellExecute这个API函数,或者在各种编程语言的中采用不同的方法来运行,如C语言可以用system函数、Visual Basic语言则可以用Shell函数,其他语言也有类似的方法。自动升级软件的基本功能是对软件进行升级,首先需要能检测到软件最新版本的信息。软件开发者将软件最新版本的信息保存为一定格式的文件,放置到网络上固定的地址,自动升级软件访问该地址下载文件到本地,解析文件内容以进行升级。文件格式可以是任意的,但考虑到通用性,宜采用容易阅读、容易解析的文件格式。下载文件时采用的通信协议也可以是任意的,但最好也是采用通用的成熟的协议,例如HTTP、FTP协议等,充分利用已有的技术,减少开发新协议的工作量。比如HTTP协议,用WinInet系列API函数来实现文件的下载。自动升级软件每运行一次,便到指定的网址下载软件最新版本的信息文件,并以此信息文件内容来获取软件最新版本的信息。下载到软件最新版本的信息文件(以下称之为配置文件)后,自动升级软件将解析该文件,根据文件内容来完成软件升级。配置文件必须满足一定的格式,我是通过读取UPDATE区段的AppName的值来判断该文件格式是否正确的,如果读到的是空内容则认为文件的格式不正确并停止升级。配置文件中包含软件最新的版本号(Version),用以和本地软件版本号相比较。本地软件版本号以命令行参数方式传入,例如:MyUpdate.exe /CurrentVersion=1.1。在配置文件中,可以定义一系列的操作命令,包括下载、复制、移动、删除文件、运行外部程序等,最终完成软件的升级。一次升级需要更新的文件往往不止一个,配置文件中指定了要下载的文件总数(FileCount),以及各个文件的文件名(Name)、下载地址(URL)、文件大小(Size)和要更新到的路径(DestPath)。在升级替换文件时,如果可执行文件或动态链接库等已驻留内存,由于操作系统的保护,文件替换是不能成功的,此时需要结束程序的运行再替换文件,也就是自动升级程序要通知正在运行的主程序:升级已经就绪、需要暂时结束程序来完成升级。通过在应用进程间发送消息的方法来实现升级完毕消息的传递,接收消息的目标窗口句柄、窗口标题、消息内容以命令行参数传入。自动升级软件可以以带进度显示的窗口方式运行,显示当前下载的文件、下载速度、完成比例和总升级进度等,让用户对升级过程有一个明确的了解。为了保持软件的友好性,软件开发者在调度自动升级程序时,也就是设计主程序时,应当允许用户对软件更新行为进行控制,可设置是否检测更新以及检测更新的时间周期。除非必须,应保留用户不对软件进行升级的选择权,升级只是一种建议,最好是能提示新版本软件优于以往版本的特性,让用户自己决定是否进行升级。不同的软件,其自动升级程序应当可以分别独立地运行,互不干扰,但是同一软件的自动升级程序应当只能运行一个实例,否则可能会发生文件读写冲突等问题。启动自动升级软件时,以命令行参数方式传入要升级的软件名,例如MyUpdate.exe /AppName=MyProgram /CurrentVersion=1.1,自动升级软件以此软件名创建互斥量,避免同时运行同一软件的多个自动升级程序实例。4 虚拟实验平台动态升级模块的设计与实现4.1 界面设计程序界面如图3所示:图3-程序界面4.2 程序执行流程图该升级程序的执行流程图如图4所示。图4-程序执行流程图4.3 主要步骤及具体实现方案4.3.1 查询服务器端信息1设计思路:服务器端信息记录于http:/localhost/update/index.asp(这里以本机测试为例)文件中,主要包括版本号、更新文件路径信息。在ASP中,使用 Response对象可以将输出发送到客户端,其中的Write方法Respongs.Write是将变量作为字符串写入当前的 HTTP 输出。这里是通过读取index.asp中的Respongs.Write得到字符串,此字符串为服务器版本号以及Client.exe更新文件路径。2具体实现如下:以本机测试为例,由strInfo=dlg->pMyFun->InternetGetInfo(strUrl)得到#”&VersionAuto&”#http:/”&ServerName&”/UpDate/Client.exe#即#1.0.0.1#http:/127.0.0.1/UpDate/Client.exe#;然后由:iPos1=strInfo.Find(“#”);iPos2=strInfo.Find(“#”,iPos1+1);NewVersion=strInfo.Mid(iPos1+1,iPos2-iPos1-1);得到服务器端版本号;最后再由:iPos1=iPos2;iPos2=strInfo.Find(“#”,iPos1+1);strUpdateUrl=strInfo.Mid(iPos1+1,iPos2-iPos1-1);得到更新文件Client.exe路径;函数Cstring:Find和Cstring:Mid将在4.3.2中说明。4.3.2 比较新旧版本1设计思路:版本号格式设计为X.X.X.X,例如客户原始版本号为1.0.0.1;这里我采用的比较方法是把版本号转换为4位数字,如:版本号1.2.3.4分别提取这4个字符然后转换成整形变量,采用公式1*1000+2*100+3*10+4转换成1234,最后比较大小。2相关函数说明:(1)Cstring:Find(str,”要查找的字符串”,pos),函数用于从给定的字符串中寻找并返回第一处匹配指定子字符串开始的序号, 第三个参数pos指定搜索开始的位置,这个参数可以省略(使用默认值1),如果字符串不能包含该子字符串相匹配部分,则返回-1;(2)Cstring:Mid(string,npos,n), 函数用于从字符串 string 的 npos 位开始截取 n 位;(3)atoi函数用于将字符串转换成整型数。3下面以版本号第一位的比较为例来说明程序版本的比较方法:iOldPos1=strOldVersion.Find(“.”);iOldPos2=strOldVersion.Find(“.”,iOldPos1+1);iOldPos3=strOldVersion.Find(“.”,iOldPos2+1);/分别保存老版本号中第一、二、三个“.”字符出现的序号到iOldPos1,iOldPos2,iOldPos3;iPos1=strNewVersion.Find(“.”);iPos2=strNewVersion.Find(“.”,iPos1+1);iPos3=strNewVersion.Find(“.”,iPos2+1);/分别保存新版本号中第一、二、三个“.”字符出现的序号到iPos1,iPos2,iPos3;strOldVer1=strOldVersion.Mid(0,1);strOldVer2=strOldVersion.Mid(iOldPos1+1,1);strOldVer3=strOldVersion.Mid(iOldPos2+1,1);strOldVer4=strOldVersion.Mid(iOldPos3+1,1);/分别从版本号字符串的第0、iOldPos1+1、iOldPos2+1、iOldPos3+1位截取1个字符长度保存到strOldVer1、strOldVer2、strOldVer3、strOldVer4;strNewVer1=strNewVersion.Mid(0,1);strNewVer2=strNewVersion.Mid(iPos1+1,1);strNewVer3=strNewVersion.Mid(iPos2+1,1);strNewVer4=strNewVersion.Mid(iPos3+1,1);/分别从版本号字符串的第0、iPos1+1、iPos2+1、iPos3+1位截取1个字符长度保存到strNewVer1、strNewVer 2、strNewVer 3、strNewVer 4;Oldnum1=atoi(strOldVer1);Oldnum2=atoi(strOldVer2);Oldnum3=atoi(strOldVer3);Oldnum4=atoi(strOldVer4);/分别把4个老版本号字符转换成整形;Newnum1=atoi(strNewVer1);Newnum2=atoi(strNewVer2);Newnum3=atoi(strNewVer3);Newnum4=atoi(strNewVer4);/分别把4个新版本号字符转换成整形;Oldnum=Oldnum1*1000+Oldnum2*100+Oldnum3*10+Oldnum4;Newnum=Newnum1*1000+Newnum2*100+Newnum3*10+Newnum4;if(Newnum>Oldnum)bHaveNewVersion=TRUE;return bHaveNewVersion;/通过比较两个版本号转换值来确定版本新旧与否。4.3.3 获得升级程序文件的路径1首先简要说明下GetModuleFileName函数:格式:GetModuleFileName(NULL, szPath,MAX_PATH);说明:把指定模块中的可执行文件绝对路径与文件名赋值给szPath,2设计思路:首先通过GetModuleFileName函数得到本地升级程序MyUpdate.exe的路径,例如:F:CUIT毕业设计备份7.24MyUpdateDebugMyupdate.exe。当然得到的路径还包括EXE名,这里需要先去掉这部分,然后才能得到目录。这里我们可以使用iPos_U =strFilePath.Find(“MyUpdate.exe”)找到程序上级目录所在字符的序号,最后使用strPath=strFilePath.Mid(0,iPos_U)得到F:CUIT毕业设计备份7.24MyUpdateDebug,即得所求正确路径。4.3.4 获得文件升级后的保存路径1首先简要说明下string.format函数:格式string.format(fm,.);第一个参数用fm表示输出的格式,每个%符号后面是一个格式化表达式,格式化表达式:%零个或多个标志最小字段宽度精度修改符格式码(PS:方括号表示可选参数),这里用到的是格式码 s:参数:字符串值(string) 含义:打印一个字符串2实现方法:通过strOutLocal.Format(“%s%s”,strPath,_T(“MyClient.exe”),这样就得到文件升级后的保存路径和文件名,即F:CUIT毕业设计备份7.24MyUpdateDebug MyClient.exe。4.3.5 从服务器下载文件并保存到本地如何从Internet上有效而稳定地下载文件 ,这是很多网络应用程序要考虑的重要问题,下面是本人针对这个问题进行的初步探索:1DWORD dwSize;/这个变量被用于存储每次调用InternetReadFile读取了多少数据;2CHAR szHead = “Accept: */*rnrn”;/用于存储多个HTTP头信息。如果在调用InternetOpenUrl时不传递这个头信息,则只能允许打开文本文件; 3VOID* szTemp16384;/缓冲变量,可以存储来自Internet的16KB的文件数据;4HINTERNET hConnect;/这是一个HINTERNET句柄,包含请求结果(来自InternetOpenUrl);5if (!(hConnect = InternetOpenUrlA (hOpen, szUrl, szHead, lstrlenA (szHead),INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_RELOAD, 0)/此调用可以打开一个使用URL的Internet文件句柄。标志表示这个文件总是被读取,而不是缓存(cache);6DWORD dwByteToRead = 0;DWORD dwSizeOfRq = 4;DWORD dwBytes = 0;/这三个值分别存储文件的大小,HttpQueryInfo内容的大小和总共读取的字节数;7if(!HttpQueryInfo(hConnect,HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL)dwByteToRead = 0;/此调用可以获得文件的大小。如果失败则dwByteToRead被置为0,并且当文件被下载时不会显示百分比和总数;8 memset(szTemp,0,sizeof(szTemp);/meset格式:void *memset(void *s, int c, size_t n);memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法;9DoInternetReadFile (hConnect, szTemp, 16384, &dwSize) while(TRUE);/此调用循环中,每次下载一个16KB的数据块。4.3.6 关于如何保存当前版本号的问题1这里采用的是使用TXT文件来保存当前客户端版号的方法,下面是用到的几个函数的说明:(1)FILE * fopen(const char * path,const char * mode); 函数说明:参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。 mode有下列几种形态字符串: r 打开只读文件,该文件必须存在; r+ 打开可读写的文件,该文件必须存在; w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件; w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。(2)*fgets(char *string, int n, FILE *stream);函数说明:从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志0。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。2实现过程:(1)首先用fopen 的r方式打开version.txt文件,看是否为空。如为空或文件不存在则默认程序的OldVersion为1.0.0.1;如不为空,则使用fgets函数读取现版本号存入OldVersion:FILE *fp = fopen(“version.txt”,”r”);if(fp = NULL)OldVersion=_T(“1.0.0.1”);elsechar str100;fgets(str,100,fp);OldVersion=str ;fclose(fp);(2)判断是否更新版本号,如是,则用fopen 的w+方式打开version.txt,清空该文件的内容(版本号),写入新版本号,即实现了版本号的更新。FILE *fp = fopen(“version.txt”,”w+”);fprintf(fp,”%s”,NewVersion.GetBuffer(0);fclose(fp);5 程序测试过程及结果5.1 老版-新版本成功升级服务器版本:2.0.0.1客户端版本:1.0.0.1测试结果如图5和图6所示。图5-检测新版本图6-升级成功5.2 版本无需更新服务器版本:1.0.0.1客户端版本:1.0.0.1测试结果如图7和图8所示。图7-检测版本图8-不需更新结 论本人在此虚拟实验平台系统中,负责动态升级模块的设计与实现,基本开发完毕,功能基本符合要求。由于本人是第一次接触VC+,开发过程中在指导老师王中科的带领下边学边做。通过此项目的开发,对动态升级模块有了新的认识和了解。在整个开发过程中,把学到的理论知识如何运用到实践中成为本人思考得最多的一点。经过此次实践,对我以后的学习以及工作将会有很大的帮助。升级功能特别是在线升级是现在很多系统中如防毒软件、网络游戏中都是必须的一个重要功能。在今后的应用开发中,在实用性方面还可以进一步加强。参考文献1小克鲁格林斯基美.Visual C+技术内幕(第四版)M.潘爱民等译.北京:清华大学出版社,1994。2 Douglas E.ComerTCP/IP网络互连技术M北京:清华大学出版社,1998。3 Andrew S.Tanenbaum计算机网络M北京:清华大学出版社,1998。4张越.Visual C+网络程序设计实例详解M.北京:人民邮电出版社,2003。5 Steven Holzner.Visual .C+ 6.0轻松进阶M.北京:电子工业出版社,2005。6 John E.Swanke.Visual .C+MFC编程实例M.北京:机械工业出版社,2005。7 张海棠.Visual C+ 6.0编程指南M.北京:航空工业出版社,2002。致 谢本文是在王中科老师的热情关心和指导下完成的,他渊博的知识和严谨的治学作风使我受益匪浅,对顺利完成本课题起到了极大的作用。在此向他表示我最衷心的感谢!在论文完成过程中,本人还得到了王守兵同学的热心帮助,本人向他们表示深深的谢意!最后向在百忙之中评审本文的各位专家、老师表示衷心的感谢!作者简介:姓 名:吴舟海