版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
39/54毕业设计(论文)标题问题多线程网络文件传输系统的设计与实现学生姓名学号专业班级指导教师评阅教师完成日期 2021年 5月15日学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中分外加以标注引用的内容外,本论文不包含任何其他个人或团队已经颁布或撰写的成果作品。本人完全意识到本声明的法令后果由本人承担。作者签名:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文办理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保留和汇编本学位论文。本学位论文属于1、保密□,在_________年解密后适用本授权书。2、不保密□。(请在以上相应方框内打“√”)作者签名:年月日导师签名:年月日
目录摘要……………1前言……………21绪论…………41.1研究背景及意义………………41.2国表里研究现状………………41.3本文研究内容…………………52系统需求分析………………62.1功能模块描述…………………62.2软件需要实现功能……………72.3通信原理及过程………………73主要实现技术………………83.1关键要点分析…………………83.2数据传输协议……………83.3C/S构架……………………123.4多线程编程…………………123.5多线程技术…………………133.6文件的分块…………………153.7多线程文件传输与断点续传…………………163.8Windowssocket编程………163.9套接字和客户—办事器通信…………………204系统概要设计与实现………204.1通信过程……………………214.2SOCKET建立连接过程………214.3文件的传输…………………235系统功能的演示……………255.1办事器和客户端运行界面……………………255.2文件传输的演示……………266总结与展望…………………286.1本文完成的主要工作………286.2未来研究展望………………28致谢……………29参考文献………………………30多线程网络文件传输系统的设计与实现摘要:文件传输是因特网上最常用的办事之一,多线程文件传输能有效地提高文件传输的速度和效率,本系统采用windowssocket实现,套接字可以看成是两个网络应用轨范进行通信时,各自通信连接中的一个端点。系统分客户端软件和办事器端软件两部分,同时需要用到多线程相关知识,一个应用轨范可以同时有多个线程一起运用CPU的资源,大大的加强对CPU的利用率,同时也从另一个方面加快了传输的速度。由于TCP/IP连接协议的办事是设计客户端/办事器应用轨范时的主流标准,所以本软件主要采用TCP/IP协议的网络通信技术;客户端,办事器类是从CAsyncSocket类中继承来的,因此本软件通信完全是异步的;轨范在WindowsXP系统、VisualC++6.0下编译通过,且运行良好。关键词:文件传输套接字多线程Abstract:isoneofthemostcommonlyusedservicesontheInternet,amulti-threadedcaneffectivelyimprovethespeedandefficiency,thissystemusetheWindowssocketsimplementation,Socketcanberegardedastwonetworkapplicationsforcommunications,eachanendpointofcommunication.Clientsoftwareandserversoftwaresystempointstwoparts,theneedtousemultithreadingknowledgeatthesametime,anapplicationcanhavemultiplethreadsatthesametimewiththeuseofCPUresources,greatlystrengthentheCPUutilization,butalsofromanotheraspecttospeedupthetransmissionspeed.AsTCP/IPagreementlinkingtheserviceisdesignedclient/serverapplicationproceduresforthemainstreamstandards,Therefore,thesoftwareusedmainlyTCP/IPagreementnetworkcommunicationtechnology;client,serverfromCAsyncSocketinheritedcategory,andthereforethesoftwareiscompletelyasynchronouscommuni-cation;proceduresinWindowsXPsystemandunderVisualC++6.0compiler,andRunningwellKeywords:TheThesocketmultithreading前言如今随着计算机应用的普及,已经有越来越多的人正在Internet(国际互联网)上畅游,许多人也已经将进入Internet作为下一个计算机升级的方针,而使用Internet进行文件传输,则是计算机联入Internet的一个重要功能之一。下面我们详细地谈一谈如何使用Internet的FTP功能进行文件传输。
FTP中文意思为文件传输协议,用于办理计算机之间的文件传送。一般说来,我们联网的主要目的就是实现信息共享,而文件传输则是计算机间实现信息共享的一个非常重要的内容之一。在Internet上早期实现文件传输并不是一件很容易的事,因为Internet是一个非常复杂的计算机环境,有个人电脑、工作站、MAC、办事器、还有大型机等。据统计目前连接在Internet上的计算机已经有四千多万台,并且每年正在以20%的速度增长。而这些连接在网上的计算机也在各自运行着分歧的操作系统,有运行Windows、Dos的个人电脑,有运行MacOS的苹果机,也有运行unix的办事器等,而各种操作系统的文件结构也各不相同。要解决这种异种机、异种操作系统之间的文件传输交流问题,需要建立一个统一的文件传输协议,这就是FTP。基于分歧的计算机操作系统,就有分歧的FTP应用轨范,而所有的这些应用轨范都遵守同一种协议,这样我们就可以把本身的文件传送给别人,或者从其他的计算机用户中获得文件。因此文件传输凡是就是指计算机利用Internet进行文件传输的办事。FTP允许您从数以千计的远程主机上把文件传输到您的主机上,您可以传输计算机轨范、图像、声音、电影或其它任何文件。FTP用于Internet上的控制文件的双向传输。在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/办事器系统(C/S架构),该系统包孕客户机端轨范和办事器端轨范,客户端和办事器端通信轨则为FTP协议。用户通过客户机轨范向办事器轨范发出命令请求,办事器轨范执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求办事器向用户传送某一个文件的一份拷贝,办事器会响应这条命令,将指定文件送至用户的机器上。客户机轨范接收到这个文件,将其存放在用户目录中。在通信协议的分层模型中,文件传输协议是在TCP(TransmissioncontrolProtocol,传输控制协议)之上的一个应用层协议,应用轨范之间的通信需要用到传输层提供的字节流透明无误传输办事。Windows操作系统具有TCP/IP协议栈,应用轨范可通过WinsockAPI函数的调用实现端到端透明数据链接的建立。网络应用轨范是一种在分歧系统的新进程间通过网络通信协议进行的进程间的通信问题。在网络中为了标识通信的进程,首先要标识网络中进程所在的主机,其次要标识主机用IP地址来标识分歧的主机,主机上分歧的进程要用使用端口号来标识。其次,在Windows中编程是通过套接字SOCKET来编程的,套接字可以看成是两个网络应用轨范进行的通信时,各自通信连接种的一个端点。通信时,其中的一个网络应用轨范将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡NIC的传输介质将这段信息发送到另一台主机的Socket种,使这段信息能穿传送到其他轨范中。要通过Internet进行通信,至少需要一对套接字,其中一个运行在客户端,称之为ClientSocket,另一个运行于办事器端面,称为ServerSocket。按照连接启动的方式以及本地要连接的方针,套接字之间的连接过程可以分为三个步骤:办事器监听、客户端请求、连接确认。办事器监听是指办事端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求是由客户端的套接字提出连接请求,要连接的方针是办事器端套接字。为此,客户端的套接字必需首先描述它要连接的办事器的套接字,指出办事器套接字的地址和端口号,然后再向办事器端套接字提出连接请求。连接确认是当办事器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把办事器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。而办事器端继续处于监听状态,继续接收其他客户端的连接请求。网络传输文件的时候还需要用到多线程和线程间拜候互斥文件的问题。创建线程后,一个应用轨范可以同时有多个线程一起运用CPU的资源,大大的加强对CPU的利用率。同时也从另一个方面加快了传输的速度。但是要遇到一个问题就是各个线程对文件的共享问题。所以建立好的信号量来实现他们之间的拜候轨则是很重要的。否则,传输的文件将会泛起很多问题。1绪论这一部分主要介绍多线程文件传输的相关背景和研究的意义,大致概括了国表里研究的现状,最后说明了本系统需要研究的主要内容。1.1研究背景及意义1.1.1研究背景目前,国表里企业对局域网的文件传输系统认识和使用情况并不好,各个企业单位在局域网内实现文件传输,资源共享还有很大的缺陷。技术无论是从理论上或实践上都还不够完善。文件传输系统由于比力复杂,可变因素较多,安全性低,因此发展还不成熟。但是随着科学技术的发展,各种以局域网为单位的文件传输系统已经进入稳健发展期,比如说市面上比力遍及使用的QQ、UC、飞鸽传书等以内部网络为中心的资源共享系统也即将进入高速发展期。在国内,随着企业资源办理的规范化和规模的不断扩大,企业的计算机资源办理将不仅仅逗留在依靠硬件或者Internet网络获取,而且将会向着安全的内部网络化资源办理方式迈进。1.1.2研究意义1.学会采用多线程提高传输速度文件传输是因特网上最常用的办事之一,多线程文件传输能有效地提高文件传输的速度和效率。2.学会利用windowssocket进行高性能开发本系统采用windowssocket实现,windowssocket是因特网上进行通信轨范设计的常用方式,是开发高性能网络轨范的基础,采用socket方式可以编写出满足各种应用需要的网络轨范,具有很强的适应性。3.掌握网络底层开发技术本课题通过对网络文件传输系统的开发,使我掌握socket编程技巧,熟悉网络底层软件开发方式。1.2国表里研究现状目前,国表里企事业单位对文件传输系统的认识和使用情况并不好,各企事业单位大多在局域网内实现文件传输,资源共享方面还存在较多缺陷,对相关技术的理论研究也不够深入。由于文件传输系统的复杂性、多变性、安全性低等特点,使得其发展还不够成熟。随着科学技术的发展,各种以局域网或是广域网为基础的文件传输系统已经进入稳健发展时期。而计算机网络通信技术已趋于成熟,促使应用于文件传输的软件种类不断增多。由于网络编程技术的发展,人们使用的文件传输软件也浮现出更多的高性能、易操作、稳定好等特点,但是开发者在注重下载功能实现的同时,往往忽略了用户上传文件的需要。在国外,用户使用的传输软件主要有网络蚂蚁(NetAnt)和网际快车(FlashGet)。这些软件大都是针对用户下载来设计的,能够实现功能完善的下载办事。在国内,用户使用的文件传输软件主要是迅雷和飞鸽传书。迅雷主要针对的是文件快速下载的实现,而飞鸽传书则主要应用于局域网中的文件共享。目前常用的文件传输软件往往功能比力单一,也缺乏良好的用户使用界面和便当快捷的办事。许多软件在断点续传、多线程传输、进度显示以及文件的动态压缩等方面还存有欠缺。随着企事业单位资源办理的规范化和规模的不断扩大,计算机的资源办理以及办公文档的发布和传递将不仅仅逗留在依靠硬件或者电子邮件的获取上,而是会向着更全面、更可靠、更快捷的标的目的发展。过去,企事业单位往往将文件传输系统与OA系统结合在一起并将其作为OA系统的一个模块来处理。对于文档传输模块的设计,凡是都是为办公文档办理而设计,并不能考虑到一些特殊文档的办理情况,例如多个文档同时传输的高效存储拜候的问题等。综上所述,目前的文件传输系统在文件多线程传输的实现上还不是很完善,虽然可供用户选择的文件传输软件种类繁多,但仍然存在质量良莠不齐、功能各有异同的问题,用户在使用的时候也总会遇到诸多的不便,需要对一些技术做进一步的改善和提高,对于那些经常需要同时传输多个文件的特殊行业和生产范畴,更加需要有针对性的进行改善。1.3本文研究内容1.软件设计原理本软件是在Windows操作系统下,VisualC++6.0环境下借用WinSock控件实现的,是基于TCP/IP协议的C/S模式,在办事器端和客户端分别以socket为中心进行编程,客户端和办事器端的界面分别是由文件发送模块和文件接收模块组成。客户端先调用connect()与办事器建立连接,然后用send()发送数据;办事器端先调用listen()侦听客户端的连接请求,然后调用accept()对连接请求进行响应,如果需要接收数据,则会调用receive()接收。2.软件设计思路我设计实现的多线程文件传输系统主要包孕两个大的部分:办事器端和客户端。其中办事器端开启办事,监听客户端的连接,然后如果有客户端开启,建立了连接以后,就可以由办事器端选择文件来进行发送传输。在办事器端,因为是多线程传输,会有文件的分割,所以文件传输的时候可以选择较大的文件进行传输,客户端同时也是和办事器端一样用多线程进行连接和接收,同时客户端可以开启多个,并同时接收办事器传输的文件。3.软件主要功能本文件传输系统主要实现了办事器端和客户端的文件传输,并且采用多线程技术,有效地提高了文件传输的效率。软件研究了Windows多线程编程技术,使用流式套接字来完成办事器端与客户端连接。按照客户端对办事器端拜候的特点,在办事器端采用异步方式监听客户端的连接请求,避免客户端长时间等待办事器端的回应泛起卡死现象,更好的完成客户的文件传输需求,充分利用办事器端的系统资源。2需求分析这一部分主要对多线程文件传输系统需要实现的基本功能进行描述以及介绍了办事器和客户端进行通信的基本原理。2.1功能模块描述我设计实现的文件传输系统主要包孕两个大的部分:办事器端和客户端。即传统的C/S模式,其中办事器端开启办事,监听客户端的连接,然后如果有客户端开启,建立了连接以后,就可以由办事器端选择文件来进行发送传输,首先是添加文件到办事器端,客户端接收文件时,点击接收是首先获取的是相关文件的地址信息,然后你双击保留文件到相关文件夹,这时候办事器就会调用相关线程进行传送。办事器只能开启一个,并向客户端传送文件,客户端可以开启多个,并且可以同时接收办事器的文件,传送文件时,办事器可以实现对文件的分割,所以可以传送较大的文件。系统不仅可以在同一台PC机上传输,同时可以在局域网内传输,体现了网络传输的功能。2.2软件需要实现的功能这里就分别介绍了办事器和客户端需要完成的功能,其中由于文件只能从办事器发送到客户端,而不能从客户端发送到办事器,所以在文件传输时办事器只能发送文件而客户端只能接收文件。2.2.1办事器端的应用轨范将完成如下功能——监听客户端的连接请求——为请求连接的客户端建立SOCKET队列——向客户端发送消息——从客户端接收消息——向客户端发送文件2.2.2客户端的通信轨范将完成如下功能——建立与办事器的连接——封锁与办事器的连接——向办事器发送消息——从办事器接收消息——从办事器接收文件2.3通信原理及过程大大都通过网络进行通信的应用轨范,非论是通过因特网还是小型的办公网络,它们都使用同样的原则和功能来执行通信。计算机上的一个应用轨范正在等待另一个轨范打开通信连接,可以说这前一个应用轨范正在“侦听”该连接请求,这很像你在等待或人给你打电话时,一直在留心电话铃声。与时同时,另一个应用轨范,一般是运行在另一台计算机上(当然也可以是同一台机器上),试图同第一个应用轨范连接。这种试图找开连接的方式就类似于向或人打电话。你拨了电话号码,并希望要找的那个人正在电话线的另一头等接电话。当然,要完成电话的呼叫,必需知道被呼叫方的电话号码。同样的道理,试图连接到第一个应用轨范的这个轨范也必需知道第一个应用轨范的网络位置或网络地址。一旦两个应用轨范建立了连接,它们之间就可以互相发送和接收消息。正像两个人打电话扳谈一样,这个连接是一个双向的通道,即双方都可以发送消息。最后,如果一方或双方完成了对话,连接即封锁,就像打完电话一样,你能够知道电话中的对方是否把电话给挂断了,或者双方由于其它原因连接不上了。一旦该应用轨范同一个应用轨范之间建立了连接,就能够在它的对话框里键入要发送的文本消息,并把它们发送给另一个应用轨范。消息被发送之后,就被加到已发送消息的列表中。接收到的每一条消息都被复制到所有已收到的消息列表中。这样就能看到完整的已发送和已接收到的消息列表,还可以对发送消息的应用轨范和接收消息的应用轨范进行比力。3主要实现技术这一部分主要介绍实现本系统相关功能需要用到的核心技术,并对相关技术进行了具体的介绍。3.1关键要点分析文件传输的本质用一句话概括就是:发送方将文件数据读出来,然后调用套接字的发送函数将数据传输到接收方,接收方调用套接字接收函数接收数据,然后重新建立文件并将数据写入文件。TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。TCP提供端到端通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。多线程可以同步完成多项任务,不是为了提高运行效率,而是为了通过提高资源使用效率来提高系统的效率。线程是一组指令的集合,或者是轨范的特殊段,它可以在轨范里独立执行,也可以把它理解为代码运行的上下文。线程负责在单个轨范里执行多任务,凡是由操作系统负责多个线程的调度和执行。WINSOCK是在Windows进行网络通信编程的API接口,也是Windws网络编程的事实标准。在网络编程中最常用的方案便是客户机/办事器模型。WindowsSockets规范定义并记录了如何使用API与Internet协议族(IPS,凡是我们指的是TCP/IP)连接,尤其要指出的是所有的WindowsSockets实现都支持流套接口和数据报套接口。3.2数据传输协议以及选择TCP作为本系统的传输协议1.TCP协议TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要感化:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收数据以及终止连接。TCP协议利用重发技术和拥塞控制机制,向应用轨范提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在Internet暂时泛起堵塞的情况下,TCP也能够包管通信的可靠。2.UDP协议用户数据报协议(UDP)如下图所示,它为高层应用提供了IP的无连接特性分组传输通路,在分歧计算机之间实现一条数据流。如果检测到错误,分组将被丢弃,且不会执行进一步的动作。UDP被称为“无连接”的,因为它不需要握手,在发生差错时也不需要重传数据。基本上,UDP在IP上增加了端口寻址功能。报头包孕源端口和目的端口、长度字段(包孕报头和数据的长度)和校验和,UDP中的校验和字段是可选的。UDP虽然不如TCP可靠,却可以在网络上快速地发送大量的数据,因而可以用于广播。它允许应用在任何时刻向任何地址发送报文。因此,它凡是用于多媒体应用,如实时的视频会议,流式音频和视频以及因特网电话。所用这些应用可以容忍小部分的分组丢失,但UDP没有任何的拥堵控制法子。分组在路由器上可能会发生溢出,从而带来严重的问题,但是,差错校验和序列编号等功能也可以加入到选用UDP的应用中去。现在,很多流应用运行在UDP之上,但是它们内建了应答和重传以减少分组的丢失。不是所用的TCP通信量始终都能通过所有的防火墙,UDP经常用作视频和音频流(例如RealAudio)的传输方式。位:015318个八位位组8个八位位组源端口目的端口长度校验和3.选择TCP作为文件传输协议尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全分歧的办事。TCP提供一种面向连接的、可靠的字节流办事。面向连接意味着两个使用TCP的应用(凡是是一个客户和一个办事器)在彼此交换数据之前必需先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。TCP通过下列方式来提供可靠性:1.应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全分歧,应用轨范产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)TCP如何确定报文段的长度。2.当TCP发出一个段后,它启动一个按时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,凡是将推迟几分之一秒3.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的按次交给应用层。5.TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。两个应用轨范通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流办事(bytestreamservice)。如果一方的应用轨范先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将泛起在TCP连接的另一端。3.2.1TCP建立连接的过程3.2.2TCP的办事特点面向连接的传输端到端的通信高可靠性,确保传输数据的正确性,不泛起丢失或乱序;全双工方式传输采用字节流方式,即以字节为单位传输字节序列;紧急数据传送功能3.2.3TCP的重传策略TCP协议用于控制数据段是否需要重传的依据是设立重发按时器。在发送一个数据段的同时启动一个重发按时器,如果在按时器超时前收到确认就封锁该按时器,如果按时器超时前没有收到确认,则重传该数据段。在选择重发时间的过程中,TCP必需具有自适应性。它需要按照互联网当时的通信情况,给出合适的数据重发。这种重传策略的关键是对按时器初值的设定。目前采用较多的算法是Jacobson于1988年提出的一种不断调整超时时间间隔的动态算法。其工作原理是:对每条连接TCP都保持一个变量RTT(RoundTripTime),用于存放当前到目的端往返所需要时间最接近的估计值。当发送一个数据段时,同时启动连接的按时器,如果在按时器超时前确认到达,则记录所需要的时间(M),并修正RTT的值,如果按时器超时前没有收到确认,则将RTT的值增加1倍。通过测量一系列的RTT(往返时间)值,TCP协议可以估算数据包重发前需要等待的时间。在估计该连接所需的当前延迟时凡是利用一些统计学的原理和算法(如Karn算法),从而获得TCP重发之前需要等待的时间值。3.3C/S构架C/S(Client/Server)结构,即大师熟知的客户机和办事器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分派到Client端和Server端来实现,降低了系统的通讯开销。目前大大都应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用分歧的模块共享逻辑组件;因此,内部的和外部的用户都可以拜候新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展标的目的。3.3.1客户端(Client)客户端(Client)或称为用户端,是指与办事器相对应,为客户提供本地办事的轨范。一般安装在普通的客户机上,需要与办事端互相配合运行。因特网发展以后,较常用的用户端包孕了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。3.3.2办事器(Server)办事器指一个办理资源并为用户提供办事的计算机软件,凡是分为文件办事器、数据库办事器和应用轨范办事器。运行以上软件的计算机或计算机系统也被称为办事器。相对于普通PC来说,办事器在稳定性、安全性、性能等方面都要求更高,因此CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所分歧。3.4多线程编程由于用到对话框,所以单线程的操作会严重影响轨范功能的实现,所以采用多线程操作,使得在打开一个对话框时,不会影响到另一个对话框的功能,在MFC轨范中创建一个线程,调用AfxBeginThread函数:CWinThreadAfxBeginThread(AFX_THREADPROCpfnThreadProc,控制函数LPVOIDpParam,传递给控制函数的参数intnPriority=THREAD_PRIORITY_NORMAL,线程的优先级UINTnStackSize=0,线程的货仓旅馆大小DWORDdwCreateFlags=0,线程的创建符号LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL线程的安全属性);结束进程:进程只是提供了一段地址空间和内核对象,其运行是通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够获得正确的清除。除了这种进程的正常退出方式外,有时还需要在轨范中通过代码来强制结束本进程或其它进程的运行。Exit-Process()函数即可在进程中的某个线程中使用,并将立即终止本进程的运行。该函数具有强制性,在执行完毕后进程即已经被结束,因此位于其后的任何代码将不能被执行。虽然ExitProcess()函数可以在结束进程的同时通知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得ExitProcess()函数在使用大将存在安全隐患。3.5多线程技术3.5.1线程的组成线程有两部分组成。1.一个是线程的内核对象,操作系统用它来对线程实施办理。内核对象也是系统用来存放线程统计信息的地方。2.另一个是线程货仓旅馆,它用于维护线程在执行代码时需要的所有函数参数和局部变量。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。线程是一种操作系统对象,它暗示在进程中代码的一条执行路径。在每一个Win32的应用轨范中都至少有一个线程,它凡是被称为主线程或默认线程。在应用轨范中也可以自由地创建别的线程去执行其他任务。线程技术使分歧的代码可以同时运行。当然,只有在多CPU的计算机上,多个线程才能够真正地同时运行。在单个CPU上,由于操作系统把CPU的时间分成很短的片段分派给每个线程,这样给人的感触感染仿佛是多个线程真的同时运行,他们只是“看起来”同时在运行。3.5.2创建一个线程每个线程必需拥有一个进入点函数,线程从这个进入点开始运行。线程函数可以使用任何合法的名字。可以给线程函数传递单个参数,参数的含义由你本身定义。线程函数必需由一个返回值,它将成为该线程的退出代码。线程函数应该尽可能的使用函数参数和局部变量。当CreateThread被调用时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来办理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。系统从进程的地址空间中分派内存,供线程的货仓旅馆使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以拜候进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的货仓旅馆。这使得单个进程中的多个线程确实能够非常容易地互相通信。一旦内核对象创建完成,系统就分派用于线程的货仓旅馆的内存。该内存是从进程的地址空间分派而来的,因为线程并不拥有它本身的地址空间。然后系统将两个值写入新线程的货仓旅馆的上端(线程货仓旅馆总是从内存的高地址向低地址建立)。3.5.3线程的终止当线程终止运行时,会发生下列操作:线程拥有的所有效户对象均被释放。在Windows中,大大都对象是由包含创建这些对象的线程的进程拥有的。但是一个线程拥有两个用户对象,即窗口和挂钩。当线程终止运行时,系统会自动撤消任何窗口,并且卸载线程创建的或安装的任何挂钩。其他对象只有在拥有线程的进程终止运行时才被撤消。线程的退出代码从STILL_ACTIVE改为传递给ExitThread或TerminateThread的代码线程内核对象的状态变为已通知。如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行。线程内核对象的使用计数递减1。当一个线程终止运行时,在与它相关联的线程内核对象的所有未结束的引用封锁之前,该内核对象不会自动被释放。3.5.4线程的调度每个线程是拥有一个上下文结构的,这个结构维护在线程的内核对象中。这个上下文结构反映了线程上次运行时该线程的CPU寄存器的状态。每隔20ms摆布,Windows要查看当前存在的所有线程内核对象。在这些对象中,只有某些对象被视为可以调度的对象。Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上次保留在线程的环境中的值。这项操作称为上下文转换。Windows实际上保留了一个记录,它说明每个线程获得了多少个运行机会。Windows被称为抢占式多线程操作系统,因为一个线程可以随时停止运行,随后另一个线程可进行调度。如你所见,可以对它进行必然程度的控制,但是不能太多。注意,无法包管线程总是能够运行,也不能包管线程能够获得整个进程,无法包管其他线程不被允许运行等等。Windows系统只调度可以调度的线程。这意味着该线程已经暂停运行,不应该给它放置任何CPU时间。在创建一个线程的时候,CreateThread函数接收的倒数第二个参数中赋值CREATE_SUSPENDED就可以创建一个暂停的线程。除了暂停的线程外,其他许多线程也是弗成调度的线程,因为它们正在等待某些事情的发生。3.6文件的分块为便于各客户端下载文件,文件被分成大小相等(最后一块除州的若干块。每一块附上校验信息,对于一个大的文件来说,这是很有必要的,因为传输层的校验方式过于简单,漏检率较高。各客户端以块为单位下载文件,一块下载完成后对该块进行校验,并和校验信息进行比力,确认无误后才认为该块己被下载。文件分块算法描述如下:欲下载某一文件的用户首先获得提供该文件的办事器的地址(包孕IP地址和端口号,该办事器必然得是公网上的一台计算机,即该办事器不位于任何NAT和防火墙之后)。与该办事器通信。办事器将记录它所看到的该用户的IP地址和端口号。该用户向办事器请求获取1到2个文件块,办事器按照当前荷载情况决意是否让该用户下载文件块。若同意该用户下载文件块,办事器将优先选择还没有被其他用户下载的文件块。向办事器请求获取必然数量的其他用户的地址。办事器随机选择必然数量的其他用户的地址返回给该用户,优先选择时延小的地址。该用户与从办事器获得的其他用户的地址通信,若不能直接通信,将请求办事器辅助。用户之间互相交换他们己经下载的文件块的信息,若需要(某用户感觉本身的下载速度慢,且本身的网络带宽的利用率远远不够,需要获得更多的其他用户的地址)的话交换他们所拥有的其他用户的地址信息。用户之间互相下载文件块,直至文件的所有块被下载。优先下载稀有的文件块,即只被少数用户拥有的文件块。由于各用户下载文件时并不是像传统的文件下载那样从文件头开始,直到文件尾,而是按必然的算法按次下载文件的各个块,因此需要将已经下载的文件块合理地存放起来,便于所有的文件块下载完成后恢复成本来的文件。该软件下载过程前先申请空间,然后按下载的文件块的序号,写到相应的文件位置中。3.7多线程文件传输与断点续传在本系统中,文件的传送是重要的功能之一,也是共享的基础。本文件传输系统跟一些重要的协议像HTTP、FTP等一样,都支持文件的多线程文件传输和断点续传功能。其目的就是为了解决网络间的文件传送问题,而且以其稳定,高速,简单而一直保持着很大的生命力。用来接收文件的客户端的多线程文件传输是最重要,也最复杂,它负责线程的办理,进度的记录等工作。算法描述如下:先连接办事器,统计能有多少在线用户能提供某一文件的下载,然后按照文件长度和用户数量决意分几个线程下载,每一线程连接一个用户,接着发送文件下载请求,请求包孕文件位置,名字,MD5校验码,需要文件的开始位置和结束位置等。开始下载后,各个线程将下载到的文件块写入到本地磁盘中。断点续传的算法描述如下:在实际网络的传输过程中,总会因为各种原因让文件的下载被终止,如果因为终止而使已经下载的资源被废弃,会造成大量的浪费,使用断点续传技术能很好地解决这一问题。断点续传的思想其实比力简单,鄙人载文件的同时生成一个临时文件,并记录文件的一些相关信息,一旦文件停止下载,临时文件保留上述信息,下次重新下载时先读取文件的相关信息当各个线程开始下载以后,并记录各个线程下载文件进程,每下载必然大小就记录一次,并把文件下载进度写到磁盘文件中,以防断电,直到下载结束。当要实现断点续传时,先校验本地文件的MD5校验码,如果校验码与源文件校验码一致,则不需要使用续传。如果纷歧致,先查询本地的文件进度文件,按照进度文件记录的数值,向远程用户发送下载请求,文件的开始位置和结束位置为文件记录的数值。3.8Windowssocket编程WindowsSockets规范定义并记录了如何使用API与Internet协议族(IPS,凡是我们指的是TCP/IP)连接,尤其要指出的是所有的WindowsSockets实现都支持流套接口和数据报套接口。为了便当这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其它几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCPIP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用轨范在网络上传输,接收的信息都通过这个Socket接口来实现。1.在初始化阶段调用WSAStartup()此函数在应用轨范中初始化WindowsSocketsDLL,只有此函数调用成功后,应用轨范才可以再调用其它WindowsSocketsDLL中的API函数。在轨范中调用该函数的形式如下:WSAStartup((WORD)((181),(LPWSADATA)&WSAData),其中(181)暗示我们用的是WinSocket1.1版本,WSAata用来存储系统传回的关于WinSocket的资料。2.建立Socket初始化WinSock的动态连接库后,需要在办事器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket的API函数都可以使用这个函数来获取失败的原因)。SOCKETPASCALFARsocket(intaf,inttype,intprotocol)3.绑定端口接下来要为办事器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。intPASCALFARbind(SOCKETs,conststructsockaddrFARname,intnamelen);参数:s:Socket对象名;name:Socket的地址值,这个地址必需是执行这个轨范所在机器的IP地址;namelen:name的长度;如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,WindowsSockets会自动将其设定适当之地址及Port(1024到5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。4.监听当办事器端的Socket对象绑定完成之后,办事器端必需建立一个监听的队列来接收客户端的连接请求。listen()函数使办事器端的Socket进入监听状态,并设定可以建立的最大连接数(目前最大值限制为5,最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。intPASCALFARlisten(SOCKETs,intbacklog);参数:s:需要建立监听的Socket;backlog:最大连接个数;办事器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server端必需再调用accept()函数,这样办事器端和客户端才算正式完成通信轨范的连接动作。为了知道什么时候客户端提出连接要求,从而办事器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。intPASCALFARWSAAsyncSelect(SOCKETs,HWNDhWnd,unsignedintwMsg,longlEvent);参数:s:Socket对象;hWnd:接收消息的窗口句柄;wMsg:传给窗口的消息;lEvent:被注册的网络事件,也便是应用轨范向窗口发送消息的网路事件,该值为下列值FD_READ、FD_WRITE、FD_OOB、FD_ACCEPT、FD_CONNECT、FD_CLOSE的组合,各个值的具体含意为FD_READ:希望在套接字S收到数据时收到消息;FD_WRITE:希望在套接字S上可以发送数据时收到消息;FD_ACCEPT:希望在套接字S上收到连接请求时收到消息;FD_CONNECT:希望在套接字S上连接成功时收到消息;FD_CLOSE:希望在套接字S上连接封锁时收到消息;FD_OOB:希望在套接字S上收到带外数据时收到消息。具体应用时,wMsg应是在应用轨范中定义的消息名称,而消息结构中的lParam则为以上各种网络事件名称。5.办事器端接受客户端的连接请求当Client提出连接请求时,Server端窗会收到WinsockStack送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。为了使办事器端接受客户端的连接请求,就要使用accept()函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。SOCKETPASCALFARaccept(SCOKETs,structsockaddrFARaddr,intFARaddrlen);参数:s:Socket的识别码;addr:存放来连接的客户端的地址;addrlen:addr的长度。6.结束socket连接结束办事器和客户端的通信连接是很简单的,这一过程可以由办事器或客户机的任一端启动,只要调用closesocket()就可以了,而要封锁Server端监听状态的socket,同样也是利用此函数。另外,与轨范启动时调用WSAStartup()憨数相对应,轨范结束前,需要调用WSACleanup()来通知WinsockDll释放Socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。intPASCALFARclosesocket(SOCKETs);参数:s:Socket的识别码;intPASCALFARWSACleanup(void);7.建立客户端的Socket客户端应用轨范首先也是调用WSAStartup()函数来与Winsock的动态连接库建立关系,然后同样调用socket()来建立一个TCP或UDPsocket(相同协定的sockets才能相通,TCP对TCP,UDP对UDP)。与办事器端的socket分歧的是,客户端的socket可以调用bind()函数,由本身来指定IP地址及port号码;但是也可以不调用bind(),而由Winsock来自动设定IP地址及port号码。8.客户端提出连接申请客户端的Socket使用connect()函数来提出与办事器端的Socket建立连接的申请,函数调用成功返回0,否则返回SOCKET_ERROR。intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数:s:Socket的识别码;name:Socket想要连接的对方地址;namelen:name的长度。9.数据的传送以包管资料的正确性,一般情况下TCPSocket的数据发送和接收是调用send()及recv()这两个函数来达成,而UDPSocket则是用sendto()及recvfrom()这两个函数,这两个函数调用成功发挥发送或接收的资料的长度,否则返回SOCKET_ERROR。intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);参数:s:Socket的识别码buf:存放要传送的资料的暂存区;lenbuf:的长度;flags:此函数被调用的方式。intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);参数:s:Socket的识别码;buf:存放接收到的资料的暂存区;lenbuf:的长度flags:此函数被调用的方式。对StreamSocket言,我们可以接收到目前inputbuffer内有效的资料,但其数量不超过len的大小。3.9套接字和客户-办事器通信统一资源定位符(URL)是在因特网上拜候站点和资源的一种重要机制。有时,你可能需要写一个轨范来实现一台客户计算机和一台办事器计算机之间的低层通信。术语“客户”和“办事器”是指两个互相通信的进程。其中一个进程(客户)连接到另一个进程(办事器)进行一次信息请求。客户需要了解办事器的地址,但在建立连接之前办事器不必知道客户的地址,甚至不必知道客户的存在。一旦建立了连接,双方即可以发送和接受信息。在客户—办事器环境中,每一端构建一个套接字来建立连接。一个套接字是进程间通信通道的一端,它和计算机上的一个特定的端口号相关联以便TCP层可以确定数据是发送给哪个应用的。两个进程都调用所在计算机操作系统软件的子轨范,建立本身的套接字。在客户机和办事器上,套接字的建立有一些区别,说明如下:客户:调用socket()子轨范,创建一个套接字。调用connect()子轨范,将该套接字连接到办事器的地址。利用read()和write()子轨范发送和接收数据。办事器:调用socket()子轨范,创建一个套接字。使用bind()子轨范将套接字和一个地址绑定(对于因特网上的一个办事器套接字来说,地址包含主机计算机的一个端口号)。利用listen()子轨范监听连接请求。调用accept()子轨范接受一个连接。利用read()和write()子轨范发送和接收数据。在连接结束时,双方封锁连接,办事器则继续监听其他的连接。有两种广泛使用的套接字类型,流套接字和数据报套接字。流套接字使用TCP协议,并将通信视为一条连续的字符流,数据报套接字则采用UDP协议,必需一次读入整个报文。4系统概要设计与实现这一部分主要介绍了C/S模式的通信过程,SOCKET建立连接的过程以及实现文件传输的相关流程。4.1通信过程C/S模式的请求响应方式TCP/IP协议三次握手过程在TCP/IP协议中,TCP协议提供可靠的连接办事,采用三次握手建立一个连接(如图3.1)。第一次握手:建立连接时,客户端发送syn包(syn=j)到办事器,并进入SYN_SEND状态,等待办事器确认;第二次握手:办事器收到syn包,必需确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时办事器进入SYN_RECV状态;第三次握手:客户端收到办事器的SYN+ACK包,向办事器发送确认包ACK(ack=k+1),此包发送完毕,客户端和办事器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与办事器开始传送数据。4.2SOCKET建立连接过程办事器创建套接字后,进行侦听,客户端创建套接字后进行连接,一旦建立连接,就可以发送接收数据,直到封锁套接字。服务器服务器 客户端create(),建立套接字band(),与本地地址绑定listen(),准备好接受连接accept(),等待接受客户端连接,receive()接收数据Close(),关闭套接字send(),发送数据Create(),建立套接字Connect(IP),与服务器连接receive()接收数据Close(),关闭套接字send()发送数据SOCKET建立连接过程4.3文件的传输4.3.1发送文件与接收文件流程4.3.2文件从办事器传输到客户端自己中断自己中断服务器客户端向客户端发送传输文件请求,等待等待服务器的请求自己中断开始传输文件进程进程开始传输文件进程进程SOCKET建立连接并传输文件SOCKET建立连接并传输文件过程中断或对方的中断过程中断或对方的中断传输完毕,结束进程传输完毕,结束进程关闭连接,返回关闭连接,返回对方拒绝对方拒绝传输文件过程首先办事器向客户端发送请求,要求传送文件,在获得客户端相应之前,双方都可以取消这次传输,同时通知对方已经取消连接;一旦客户端给了办事器响应,则建立进程,进行传输;建立的进程里,要定义新的SOCKET套接字,以建立连接,在传输过程中,同样可以进行间断,同时通知对方已经取消连接;传输结束后,断开连接,结束该进程。5系统功能的演示这一部分主要给出了办事器和客户端的运行界面,以及演示了文件是怎样从办事器传输到客户端的。5.1办事器和客户端运行界面——办事器端——客户端5.2文件传输的演示首先新建两个文件夹,分别命名为“文件一”和“文件二”,在文件一中新建一个TXT格式的文本文档,本系统将要演示的是把文件一中的新建文本文档传输到文件二中,传输步骤如下:1.在办事器端添加文件,选择文件一中的新建文本文档,然后确认选择2.在客户端界面点击接收按钮,即可接收接新建文本文档的路径信息3.在客户端界面中双击新建文本文档,选择文件二为保留的路径,新建文本文档即传输到文件二中相关界面如下:——添加文件一中的新建文本文档到办事器中
——添加成功后的界面——在客户端界面点击接收按钮——将新建文本文档保留到文件二,再重新保留一次,证明前面一次已经将新建文本文档传输到文件二中6总结与展望这一部分主要总结了多线程网络文件传输系统的相关功能以及对本系统提出了一些需要研究加以改善的地方。6.1本文完成的主要工作在老师指导和同学辅助下,我基本上完成了多线程网络文件传输系统的设计,并实现了文件传输一般的功能。该网络文件传输系统主要包孕两个大的部分:办事器端和客户端,其中办事器端开启办事,监听客户端的连接,然后如果有客户端开启,建立了连接以后,就可以由办事器端选择文件来进行发送传输。文件只能从办事器传递给客户端,采用的是TCP协议,客户端必需和办事器端先连接。同时系统采用了多线程技术,可以对较大文件进行分割传送,同时可以开启多个客户端,并同时接收办事器传送的文件,且传输速率也比力高。6.2未来研究展望首先对系统提出一些改善的地方如下:1.本系统只能实现从办事器到客户端的单向传输,下一步要实现办事器和客户端间的彼此传输,办事器可以当成客户端,客户端也可以成为办事器2.本系统没有客户端与办事器间的彼此交流,未来可以增加它们彼此交流的一个模块3.本软件在网络传输上的体现只是在局域网中进行传输,未来可以进一步研究,实现文件在互联网上的传输接下来是关于多线程网络文件传输系统未来的发展趋势:多线程网络文件传输系统未来发展趋势是提高可靠性和高效性,因为随着网络技术的不断发展,无论是事业单位还是各类企业都在大力推进办公自动化的进程,人们迫切需要一种能够更好地满足日常办公需求的文件传输办理系统。未来的发展趋势是将多线程技术、断点续传技术应用于网络文件传输系统中,实现文件传输进度显示、开机自动重传和文件校验等功能,不仅能提高文件传输的可靠性和高效性,也能让用户的使用更加简单便当。致谢这次毕业设计开发过程中,获得了很多同学跟老师的辅助,分外感谢感动他们的无私奉献,同学间的彼此交流,老师的细心指导促成了这次毕业设计的完成,心里分外愉快。在这里分外要感谢感动我的导师。我的导师干事分外细心负责,从一开始选题,到开题敷陈,到中期检查,到后期检查,每个阶段都分外关心我们的进展,本着认真负责的态度给我们分析,讲解,改正。同时导师渊博的知识,使我受益匪浅,每次遇到无法解决的问题时,都能在老师那获得满意的答案。由衷的感谢感动我的导师的耐心指导!在开发过程中,同样获得了不少同学们的鼓励和辅助,我的作品得以完成离不开你们的关心和支持,感谢感动你们。老师和同学们的指导和辅助,给了我很大的鼓舞,使我在遇到艰巨时不至于止步不前,而是迎风破浪,克服难题。从老师和同学们的建议中获得了宝贵的学习和人生经验,这将对我以后的道路有莫大的辅助。感谢感动你们!参考文献[1]孙钟秀,费翔林,骆斌等.操作系统教程[M].北京:高档教育出版社,2008:110.[2]严蔚敏,吴伟民等.操作系统[M].北京:清华大学出版社,2007:38-88.[3]汤子瀛,梁红兵等.计算机操作系统[M].西安:西安电子科技大学出版社,,2003:56-78.[4]谭浩强等.C++面向对象轨范设计[M].北京:清华大学出版社,,2006:59-125.[5]BICLF,SHAWAC.操作系统原理[M].梁洪亮,等译.北京:机械工业出版社,,2005:65[6]谢希仁等.计算机网络(第5版)[M].北京:电子工业出版社,2007:25-30[7]杨金生.计算机网络实验指导[M].上海:上海交通大学出版社,2005:20-26.[8]史蒂文斯.TCP/IP详解卷1:协议[M].北京:机械工业出版社,2000:99.[9]王力.VisualC++6.0MFC类库参考手册[M].北京:人民邮电出版社,2021:286[10](美)SteveHeller著,胡凤燕译.C++编程基础:标准库编程[M].北京:电子工业出版社,2021:110-120.[11]尹立民.VisualC++6.0应用编程150例[M].北京:电子工业出版社,2021:125.[12](美)Schildt,H。著,周志荣等译.C++参考大全[M].北京:电子工业出版社,2021:58.[13]DouglasE.ComputerNetworksandInternets[M].北京:清华大学出版社,2006:289.[14]马隣.Winsock2网络编程实用教程[M].北京:清华大学出版社,2021:156-186.[15]王炎平.Windows网络与通信轨范设计[M].北京:人民邮电出版社,2006:256.[16]赵景波.C++Builder6.0基础教程[M].北京:机械工业出版社,2021:289-300.[17]陈灿煌.C++Builder6彻底研究[M].北京:中国铁道出版社,2021:145-160.[18](美)W.RichardStevens.TCP/IP详解.卷1协议(影印版)[M].北京:机械工业出版社,2005:189-198.[19]科默.用TCP/IP进行网际互连(第一卷):原理、协议与结构[M].北京:电子工业出版社,2007:156-182.[20]Tanenbaum.ComputerNetworks,AndrewS[M].北京:清华大学出版社,2008:25.附录:核心代码:办事器端voidCTCPServer_FT::ListenRequest(){ m_bEndListenThread=FALSE;//开始监听 DWORDid; HANDLEh=CreateThread(NULL,0,ThreadListen,this,0,&id);//创建句柄 //线程要执行的函数为ThreadListen,将this指针传递给线程,线程ID为id,创建成功,返回新线程的一个句柄 CloseHandle(h);//封锁句柄,并不终止线程}//功能:停止监听//参数:无//返回:无voidCTCPServer_FT::StopListen(){ m_bEndListenThread=TRUE;}//功能:监听线程//参数:LPVOIDlpParam//返回:无意义DWORDWINAPICTCPServer_FT::ThreadListen(LPVOIDlpParam){ CTCPServer_FT*pServer=(CTCPServer_FT*)lpParam; SOCKETsockListen=socket(AF_INET,SOCK_STREAM,0);//创建socket //地址家族为internet,用于TCP和UDP,字节流,特定的协议 SOCKADDR_INsin;//转换地址 sin.sin_family=AF_INET; sin.sin_addr.s_addr=0;//ip地址,以网路字节按次。 sin.sin_port=htons(pServer->m_iListenPort); //端口号,从主机字节按次转化成网络字节按次 if(bind(sockListen,(SOCKADDR*)&sin,sizeof(sin))==SOCKET_ERROR) {//若将socket与本地地址绑定失败 closesocket(sockListen);//封锁socket pServer->m_pWnd->SendMessage(WM_BINDERROR);//显示错误 return1; } if(listen(sockListen,5)==SOCKET_ERROR) {//若将socket置于监听失败 closesocket(sockListen); pServer->m_pWnd->SendMessage(WM_LISTENERROR); return1; } //开始监听 pServer->m_pWnd->SendMessage(WM_STARTLISTEN); fd_setfdListen;//结构体,将socket放进一个集合 timevalseltime;//结构体,指按时间值(秒+毫秒) seltime.tv_sec=0;//秒 seltime.tv_usec=10000;//毫秒==10秒 while(!pServer->m_bEndListenThread) {//办事器在监听状态 FD_ZERO(&fdListen);//将集合清零 FD_SET(sockListen,&fdListen);//将socket添加到set中 if(select(0,&fdListen,NULL,NULL,&seltime)<=0||!FD_ISSET(sockListen,&fdListen)) continue; //如果在规按时间内,set中无socket可读出||socket不在set中,结束本次循环,继续下次循环 intlen=sizeof(sin); SOCKETsock=accept(sockListen,(SOCKADDR*)&sin,&len); //接受socket上的连接 PARAMRECV*pParamRecv=newPARAMRECV;//结构体,接收线程参数 pParamRecv->sock=sock; pParamRecv->ptr=pServer; DWORDid; HANDLEh=CreateThread(NULL,0,ThreadRecv,pParamRecv,0,&id); //创建ThreadRecv线程,将pParamRecv传递给线程 CloseHandle(h); } closesocket(sockListen); return0;}//功能:接收线程//参数:LPVOIDlpParam//返回:无意义DWORDWINAPICTCPServer_FT::ThreadRecv(LPVOIDlpParam){ PARAMRECV*pParam=(PARAMRECV*)lpParam;//指向接收线程的指针 CTCPServer_FT*pServer=(CTCPServer_FT*)pParam->ptr;//指向Server的指针 fd_setfdRecv;//结构体,接收线程集合 timevalseltime;//结构体,指按时间值==10s seltime.tv_sec=0; seltime.tv_usec=10000; while(1) { FD_ZERO(&fdRecv);//集合清零 FD_SET(pParam->sock,&fdRecv);//将已连接的socket加入集合 if(select(0,&fdRecv,NULL,NULL,&seltime)<=0||!FD_ISS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安塞腰鼓听评课记录
- 陕西省宝鸡市太白县2024年一级造价工程师《土建计量》全真模拟试卷含解析
- 山东省聊城市临清市2024年一级造价工程师《土建计量》预测密卷含解析
- 四川省宜宾市江安县2024-2025学年七年级上学期期中道德与法治试题(含答案)
- 党课课件含讲稿:加强海洋生态环境科技创新 支撑海洋强国建设
- 理解与应用民法模板
- 《财务报表课程》课件
- 吉林橡胶水坝施工方案
- 北京春节树木亮化施工方案
- 五年级数学下册冀教版教学计划
- 科学《地震》课件
- 2024年长期照护师职业技能竞赛理论考试题库(含答案)
- 山东省淄博市2023-2024学年高一上学期期末教学质量检测政治试题 含解析
- 2024合同模板终止解除劳动合同通知书范本
- 《中小企业生存之道》课件
- 前程无忧招聘测评题库及答案
- 人教版-六年级上册数学-百分数(一)单元测试(含答案)
- 盆腔脓肿护理病例讨论
- 教学用品租赁合同模板
- 正确看待苦与乐课件
- 【培训课件】建设工程施工工地消防安全管理
评论
0/150
提交评论