毕业设计(论文)-基于visual_C++的P2P文件传输.doc_第1页
毕业设计(论文)-基于visual_C++的P2P文件传输.doc_第2页
毕业设计(论文)-基于visual_C++的P2P文件传输.doc_第3页
毕业设计(论文)-基于visual_C++的P2P文件传输.doc_第4页
毕业设计(论文)-基于visual_C++的P2P文件传输.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JISHOUUNIVERSITY专业课课程论文题 目:基于visual_C+的P2P文件传输作 者:熊戈学 号:所属学院:信息科学与工程学院专业年级:总 评 分:完成时间:吉首大学信息科学与工程学院P 2 P摘 要P2P是peer-to-peer的缩写,或称为对等联网。P2P技术使得网络上的沟通变得容易,网络上现有的许多服务可以归入P2P的行列。即时讯息系统如微软的MSN Messenger及国内的OICQ是最流行的P2P应用。由于它们都需要有位于中心的服务器来协调,于是便有了编写本软件的构想。本软件功能摆脱了中心服务器的束缚,是一个实用性通信软件。它的基本功能就是让用户能够在局域网甚至在广域网上点对点的进行交流。由于TCP/IP连接协议的服务是设计客户端/服务器应用程序时的主流标准,所以本软件主要采用TCP/IP协议的网络通信技术;客户端,服务器类是从CAsyncSocket类中继承来的,因此本软件通信完全是异步的;程序在 Windows XP系统、Visual C6.0下编译通过,并在Windows NT100M 以太网上运行良好。本软件创建的是对话框应用程序,采用多线程操作;连接后服务器可以充当客户机,客户机也可以充当服务器。它们可以在同一台计算机上,也可以把应用程序复制到另一台计算机上,这样没有中间服务器存在,在两个独立的计算机上分别运行应用程序,从而通过网络传递消息。本软件主要完成了以下功能:基本文字聊天功能,传输文件功能,远程控制功能。还有语音聊天功能需要进一步改进,才能达到预期效果。在传输文件过程中,需要建立另一个进程,在新建的进程中传输文件,并且可以随时中断传输;远程控制功能主要是获取对方机器信息,获取对方进程,锁定和解锁键盘,锁定和解锁鼠标等。关键词 P2P;客户端;服务器;通信;多线程P 2 P AbstractP2P is the acronym for peer-to-peer, or called on other network. P2P network technology makes the communication easier, and many existing services can be classified as P2P service. Instant messaging systems such as Microsofts MSN Messenger and domestic OICQ was the most popular P2P application. As they both need the central server to coordinate the server, there is the preparation of this software concept. This software is a practical communication software, as it functions from a central server constrains. Its basic function is to allow users to the LAN or WAN in the online peer-to-peer exchange. As TCP/IP agreement linking the service is designed client / server application procedures for the mainstream standards, Therefore, the software used mainly TCP/IP agreement network communication technology; client, server from CAsyncSocket inherited category, and therefore the software is completely asynchronous communication; procedures in Windows XP system and under Visual C + + 6.0 compiler , and is running good in Windows NT and 100M Ethernet.This software creates the dialog box applications through multi-threaded operation; after connection the server can act as client, Clients can also act as servers. They can be on the same computer, can also copy the application to another computer, by doing so intermediate server no longer exists. operating applications separately in two computers so that information is imparted through the network.The software completed the following major functions : basic text chat, file transfer functions, remote control functions. Voice chat also need to be further improved in order to achieve the desired effect. Transfer files in the process, we need to create another process in the new process to transfer files, and transmission can be interrupted at any time; Remote control function is the main access to other machines of information, access to each others process, lock and unlock the keyboard and mouse locking and unlocking other. Keywords P2P ;client; Server;communication;multi-thread38 目 录第一章 引言1.1课题的主要内容和国内外发展方向61.2软件的预期实现的目标和完成71.2.1服务器端的应用程序将完成如下功能71.2.2客户端的通讯程序将完成如下功能7第二章 关键技术2.1 TCP与UDP协议的选择82.1.1 TCP协议82.1.2 UDP协议92.2 多线程编程92.3 WinInet编程与WinSock编程的比较及其优点102.4 通信原理10第三章 需求分析3.1 功能需求113.2 性能需求11第四章 具体设计4.1 基本的SOCKET函数114.2 通信原理及过程154.2.1 C/S模式的请求响应方式154.2.2 SOCKET建立连接过程164.2.3传输文件过程174.2.4远程控制过程18第五章 具体实现5.1实现基本聊天的功能185.2实现传输文件的功能265.3截图275.4语音通信285.5远程控制30第五章 测试后存在的问题及解决办法33总 结36参考文献37致 谢38第一章 引 言1.1课题的主要内容和国内外发展方向 P2P可以理解为“伙伴对伙伴”的意思。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。2002年,尼古拉斯曾斯特姆(Niklas Zennstrom)把P2P音乐下载软件KaZaA买给一家小公司时,得到了50万美元;2005年,他把P2P通信软件Skype出售给eBay时,赚到了21亿美金。三年前,因为P2P音乐下载,他和创业伙伴面临着来自美国唱片工业协会的诉讼威胁;三年后,P2P支撑的互联网通信已经成为市场的宠儿。P2P使得一个用户可以直接连接到其它用户的计算机,并交换文件,而不是像过去那样连接到服务器去浏览与下载。P2P另一个重要特点是改变互联网现在的以大网站为中心的状态,重返“非中心化”,并把权力交还给用户。 P2P看起来似乎很新,但是正如B2C、B2B是将现实世界中很平常的东西移植到互联网上一样,P2P并不是什么新东西。在现实生活中我们每天都按照P2P模式面对面地或者通过电话交流和沟通。即使从网络看,P2P也不是新概念,P2P是互联网整体架构的基础。互联网最基本的协议TCP/IP并没有客户端和服务器的概念,所有的设备都是通讯的平等的一端。在十年之前,所有的互联网上的系统都同时具有服务器和客户端的功能。当然,后来发展的那些架构在TCP/IP之上的软件的确采用了客户机/服务器的结构:浏览器和Web服务器,邮件客户端和邮件服务器。但是,对于服务器来说,它们之间仍然是对等联网的。以email为例,互联网上并没有一个巨大的、唯一的邮件服务器来处理所有的email,而是对等联网的邮件服务器相互协作把email传送到相应的服务器上去。但是过去的5年里,互联网的发展至少从表面上远离了P2P,互联网上绝大部分的节点也不能和其它节点直接地交流。今天,P2P再一次被关注主要是由于Napster以及ICQ类软件的出现,虽然在Napster之前P2P方式的研究也从未停止。Napster正是唤醒了深藏在互联网背后的对等联网。Napster的文件共享功能在局域网中共享目录也是再平常不过的事情。但是Napster的成功促使人们认识到把这种“对等联网”拓展到整个互联网范围的可能性。当然,在许多人的眼中,Napster并不是纯粹的P2P,它仍然需要一个处于中心协调机制。P2P引导网络计算模式从集中式向分布式偏移,也就是说网络应用的核心从中央服务器向网络边缘的终端设备扩散:服务器到服务器、服务器到PC机、PC机到PC机,PC机到WAP手机所有网络节点上的设备都可以建立P2P对话。这使人们在Internet上的共享行为被提到了一个更高的层次,使人们以更主动深刻的方式参与到网络中去,正如I2(第二代互联网:简单的说,就是借助IPv6的力量,解决绝大多数第一代互联网遇到的难题,把网络、电视、电话还有所有可能想象到的应用囊括其中)之父Doug. Van Houweling在他的中国之行时说到的:“下一代互联网民们将真正参与到网络中来,每个人都能为网络的资源和功能扩展作出自己的贡献。”P2P给互联网的分布、共享精神带来了无限的遐想。 在国外,P2P发展已经如火如荼,Intel、Sun、Microsoft等公司已经在制定P2P的标准。P2P技术的巨大影响力横亘了内容发行、通信等领域,它广阔的前景引来微软、Google、雅虎、新闻集团等公司的关注,但是P2P对内容产业以及对传统通信公司的负面影响依然存在,在很多国家都曾经出现过互联网服务提供商封杀P2P的事件。Napster虽然败诉,这似乎预示着P2P的挫折,但实际上这却意味着由P2P带来的新的规则正在建立,相关的数字版权立法已经开始,P2P的力量开始逐步显示出来。国内P2P的市场基本从2000年底开始逐步启动。目前,国内P2P的应用主要有两个方向:文件共享及协同工作。具有代表性的技术有:P2P多线程断点续传的实现;P2P之UDP穿透NAT的原理与实现;IPTV业务承载网的解决;IPTV流媒体分发和交付技术的新突破;第三代google排名搜索引擎技术;网格的应用;基于P2P思想的QQ蠕虫的原理与防治;网络电话;流媒体应用等。1.2软件的预期实现的目标和完成1.2.1服务器端的应用程序将完成如下功能通过数据库验证用户名密码登陆设置服务器的账号监听客户端的连接请求为请求连接的客户端建立SOCKET队列向客户端发送消息从客户端接收消息向客户端发送文件从客户端接收文件与客户端语音通信截取屏幕可以与客户端进行远程协助(控制键盘鼠标进程)1.2.2客户端的通讯程序将完成如下功能通过数据库验证用户名密码登陆建立与服务器的连接关闭与服务器的连接向服务器发送消息从服务器接收消息向服务器发送文件从服务器接收文件与服务器语音通信截取屏幕可以与服务器进行远程协助(控制键盘鼠标进程)第二章 关键技术2.1 TCP与UDP协议的选择2.1.1 TCP协议TCP/IP通常指的是关于TCP和IP的任何东西,它是一个统称,它既可以包括其它协议,其它应用程序,还可以包括网络介质。基本结构如图2.1, 这个结构存在于Internet中计算机之中,它决定了计算机在网络上的动作。 TELNETFTPSMTPDNSTCPUDPIPARPANETSATNETLAN协议网络应用层传输层网络层物理层和数链层图2 1TCP/IP模型中早期的协议和网络如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP资料包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP协议发送和接收域名数据库,但使用UDP协议传送有关单个主机的信息。TCP协议即采用流式套接字SOCKET_STREAM。2.1.2 UDP协议UDP与TCP位于同一层,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询-应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。UDP协议使用数据报式套接字SOCKET_DGRAM。虽然基于TCP/IP连接协议(流套接字)的服务是设计客户机/服务器应用程序时的主流标准,但有些服务也是可以通过无连接协议(资料报套接字)提供的。先介绍一下TCP socket 与UDP socket在传送数据时的特性:Stream (TCP) Socket提供双向、可靠、有次序、不重复的数据传送。Datagram(UDP) Socket虽然提供双向的通信,但没有可靠、有次序、不重复的保证,所以UDP传送数据可能会收到无次序、重复的数据,甚至数据在传输过程中出现遗漏。由于UDP Socket 在传送数据时,并不保证数据能完整地送达对方,所以本程序采用TCP协议处理Socket,以保证数据的正确性。一般情况下TCP Socket 的数据发送和接收是调用send() 及recv() 这两个函数来达成,而 UDP Socket则是用sendto() 及recvfrom() 这两个函数,这两个函数调用成功发挥发送或接收的数据的长度,否则返回SOCKET_ERROR。2.2 多线程编程 由于用到对话框,所以单线程的操作会严重影响程序功能的实现,所以采用多线程操作,使得在打开一个对话框时,不会影响到另一个对话框的功能,在MFC程序中创建一个线程,调用AfxBeginThread函数:CWinThread AfxBeginThread(AFX_THREADPROC pfnThreadProc, 控制函数LPVOID pParam, 传递给控制函数的参数int nPriority = THREAD_PRIORITY_NORMAL, 线程的优先级UINT nStackSize = 0, 线程的堆栈大小DWORD dwCreateFlags = 0, 线程的创建标志LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 线程的安全属性);结束进程:进程只是提供了一段地址空间和内核对象,其运行是通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其它进程的运行。Exit- Process()函数即可在进程中的某个线程中使用,并将立即终止本进程的运行。 该函数具有强制性,在执行完毕后进程即已经被结束,因此位于其后的任何代码将不能被执行。虽然ExitProcess()函数可以在结束进程的同时通知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得ExitProcess()函数在使用上将存在安全隐患。2.3 WinInet编程与WinSock编程的比较及其优点1、网络编程简单使用WinSock编程,用户需要熟悉网络通信及TCP/IP和各种协议;而使用WinInet进行开发,就不需要了解具体实现协议,从而简化了网络编程。另外,WinInet函数的调用形式与多数Win32 API函数类似,也便于用户掌握和使用。2、程序维护简单,升级方便Internet发展迅速,其各种协议也在不断发展与完善。WinInet隐藏了协议的具体的协议细节,使得应用程序不必直接实现协议,而只需要调用一个协议接口,这样在协议更新时,只要更新WinInet动态链接库即可,程序本身无须做任何修改。3、性能优越,支持多线程WinInet函数支持多线程,可以在多线程中调用各种WinInet函数而不用担心发生各种并发问题,WinInet函数在内部处理所有的多线程并发、死锁等问题。2.4 通信原理及过程大多数通过网络进行通信的应用程序,不论是通过因特网还是小型的办公网络,它们都使用同样的原则和功能来执行通信。计算机上的一个应用程序正在等待另一个程序打开通信连接,可以说这前一个应用程序正在“侦听”该连接请求,这很像你在等待某人给你打电话时,一直在留心电话铃声。与时同时,另一个应用程序,一般是运行在另一台计算机上(当然也可以是同一台机器上),试图同第一个应用程序连接。这种试图找开连接的方式就类似于向某人打电话。你拨了电话号码,并希望要找的那个人正在电话线的另一头等接电话。当然,要完成电话的呼叫,必须知道被呼叫方的电话号码。同样的道理,试图连接到第一个应用程序的这个程序也必须知道第一个应用程序的网络位置或网络地址。一旦两个应用程序建立了连接,它们之间就可以互相发送和接收消息 。正像两个人打电话交谈一样,这个连接是一个双向的通道,即双方都可以发送消息。最后,如果一方或双方完成了对话,连接即关闭,就像打完电话一样,你能够知道电话中的对方是否把电话给挂断了,或者双方由于其它原因连接不上了。一旦该应用程序同一个应用程序之间建立了连接,就能够在它的对话框里键入要发送的文本消息,并把它们发送给另一个应用程序。消息被发送之后,就被加到已发送消息的列表中。接收到的每一条消息都被复制到所有已收到的消息列表中。这样就能看到完整的已发送和已接收到的消息列表,还可以对发送消息的应用程序和接收消息的应用程序进行比较。这就是在两个或多个应用程序间进行网络通信的基本工作原理。 第三章 需求分析3.1功能需求 随着个人计算机和互联网的普及,越来越多的人开始使用网络这个媒介来发送,接收信息,计算机网络给人们生产和生活带来了巨大的便利。近年来,P2P(Peer-to-Peer,对等互联或点对点技术)作为因特网通信应用中一项新兴技术,他的发展迅速。基于P2P方式实现的软件,已经广泛应用于资源的下载、游戏的互动、交互式媒体播放、分布式计算等多种领域,并在越来越多的领域展现了巨大的应用潜力。但是,到目前为止,仍然没有针对P2P的统一的网络应用开发标准,其体系结构仍在不断地推陈出新。微软公司在.NET Framework 3.5中新增了System.Net.PeerToPeer命名空间,该命名空间下提供的类简化了利用P2P开发应用程序的难度,为创建P2P应用程序提供了简单的实现方法和途径。3.2 性能需求 由于本设计是安装在个人电脑上,要求程序能有较强的稳定性,能在一个长时间工作的环境中运行。保证传输稳定。第四章 具体设计4.1 基本的SOCKET函数 为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其它几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCPIP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。1在初始化阶段调用WSAStartup()此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其它Windows Sockets DLL中的API函数。在程序中调用该函数的形式如下:WSAStartup(WORD)(181),(LPWSADATA)&WSAData),其中(181)表示我们用的是WinSocket1.1版本,WSAata用来存储系统传回的关于WinSocket的资料。2、建立Socket初始化WinSock的动态连接库后,需要在服务器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket 的API函数都可以使用这个函数来获取失败的原因)。SOCKET PASCAL FAR socket( int af, int type, int protocol )参数 af目前只提供 PF_INET(AF_INET);type:Socket 的类型 (SOCK_STREAM、SOCK_DGRAM);protocol:通讯协定(如果使用者不指定则设为0);如果要建立的是遵从TCPIP协议的socket,第二个参数type应为SOCK_STREAM,如为UDP(数据报)的socket,应为SOCK_DGRAM。3、绑定端口接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR name,int namelen );参 数: s:Socket对象名;name:Socket的地址值,这个地址必须是执行这个程序所在机器的IP地址;namelen:name的长度; 如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets 会自动将其设定适当之地址及Port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。4、监听当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。int PASCAL FAR listen( SOCKET s, int backlog );参 数: s:需要建立监听的Socket;backlog:最大连接个数;服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server 端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );参数: 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 端窗会收到Winsock Stack送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用accept() 函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR addr,int FAR addrlen );参数:s:Socket的识别码;addr:存放来连接的客户端的地址;addrlen:addr的长度。6、结束 socket 连接结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()憨数相对应,程序结束前,需要调用 WSACleanup() 来通知Winsock Dll释放Socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。int PASCAL FAR closesocket( SOCKET s );参数:s:Socket 的识别码;int PASCAL FAR WSACleanup( void );7、建立客户端的Socket客户端应用程序首先也是调用WSAStartup()函数来与Winsock的动态连接库建立关系,然后同样调用socket()来建立一个TCP或UDP socket(相同协定的sockets才能相通,TCP对TCP,UDP对UDP)。与服务器端的socket不同的是,客户端的socket可以调用bind()函数,由自己来指定IP地址及port号码;但是也可以不调用 bind(),而由 Winsock来自动设定IP地址及port号码。8、客户端提出连接申请客户端的Socket使用connect()函数来提出与服务器端的Socket建立连接的申请,函数调用成功返回0,否则返回SOCKET_ERROR。int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen );参 数:s:Socket 的识别码;name:Socket想要连接的对方地址;namelen:name的长度。9、数据的传送 以保证资料的正确性,一般情况下TCP Socket 的数据发送和接收是调用send() 及recv() 这两个函数来达成,而 UDP Socket则是用sendto() 及recvfrom() 这两个函数,这两个函数调用成功发挥发送或接收的资料的长度,否则返回SOCKET_ERROR。int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags );参数:s:Socket 的识别码buf:存放要传送的资料的暂存区;len buf:的长度;flags:此函数被调用的方式。int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags );参数:s:Socket 的识别码; buf:存放接收到的资料的暂存区;len buf:的长度flags:此函数被调用的方式。对Stream Socket 言,我们可以接收到目前input buffer内有效的资料,但其数量不超过len的大小。4.2 通信过程4.2.1 C/S模式的请求响应方式 图3. 1 TCP/IP协议三次握手过程 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接(如图3.1)。第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据。4.2.2 SOCKET建立连接过程服务器客户端create(),建立套接字band(),与本地地址绑定listen(),准备好接受连接accept(),等待接受客户端连接,receive()接收数据 Close(),关闭套接字send(),发送数据Create(),建立套接字Connect(IP),与服务器连接receive()接收数据 Close(),关闭套接字send()发送数据图3. 2 SOCKET建立连接过程 服务器创建套接字后,进行侦听,客户端创建套接字后进行连接,一旦建立连接,就可以发送接收数据,直到关闭套接字。4.2.3传输文件过程 自己中断 服务器客户端向客户端发送传输文件请求,等待等待服务器的请求自己中断开始传输文件进程进程开始传输文件进程进程SOCKET建立连接并传输文件SOCKET建立连接并传输文件过程中断或对方的中断过程中断或对方的中断传输完毕,结束进程传输完毕,结束进程关闭连接,返回关闭连接,返回对方拒绝对方拒绝图3. 3传输文件过程 首先服务器向客户端发送请求,要求传送文件,在得到客户端相应之前,双方都可以取消这次传输,同时通知对方已经取消连接;一旦客户端给了服务器响应,则建立进程,进行传输;建立的进程里,要定义新的SOCKET套接字,以建立连接,在传输过程中,同样可以进行中断,同时通知对方已经取消连接;传输结束后,断开连接,结束该进程。4.2.4远程控制过程客户端服务器已经建立了连接已经建立了连接发送远程控制请求接受远程控制请求修改注册表向对方发送结果接受结果信息判断命令类别退出退出图3. 4远程控制过程首先客户端向服务器发出请求,服务器同意后建立连接,用户如果想执行某个功能,则向服务器发送消息,服务器收到消息后根据标志字符判断属于哪项操作,然后作出相应操作,直到退出。第五章 具体实现5.1实现基本聊天的功能1、创建应用程序 创建一个对话框风格的应用程序,过程: 设置工程名称和保存路径-选择 “基本对话框”-选择“Windows SocketsW”- 选择“Windows SocketsW”- 选择“作为静态的DLL”或“作为共享DLL”-完成。具体过程如下图所示:新建-工程-MFC AppWizardexe ,设置工程名称和保存路径(如图3.5):图3. 5设置工程名称和保存路径下一步选择 “基本对话框”, 点击下一步(图3.6):图3. 6选择 “基本对话框”选择 Windows SocketsW,点击下一步(图3.7):图3. 7选择 “Windows SocketsW” 如果想在其它机器上脱离函数库运行,选择“作为静态的DLL”, 否则默认的“作为共享DLL”就行,点击完成(如图3.8):图3. 8选择“作为静态的DLL”或“作为共享DLL”2、布置窗口和启动功能对话框布局:客户端登陆窗口(如图3.9):图3. 9客户端登陆窗口客户端操作界面(图3.10):图3. 10客户端操作界面客户端对话框上控件的作用如表3.1。控件功能ID标题VALUEBUTTON1连接到服务器IDC_BUTTON1CONNECTBUTTON2停止与服务器连接IDC_BUTTON2STOPBUTTON3发送消息IDC_BUTTON3SENDBUTTON4托盘(缩放到右下角)IDC_BUTTON4HIDEBUTTON5接收文件IDC_BUTTON5RECEIVEBUTTON6停止接受文件IDC_BUTTON6StopBUTTON7发送文件IDC_BUTTON7TransmissonBUTTON8语音聊天IDC_BUTTON8PHONEBUTTON10设置字体大小IDC_BUTTON10FONTBUTTON11清除编辑框内纪录IDC_BUTTON11clearPROGRESS1发送文件进度IDC_PROGRESS1 m_CtrlProgressSendLIST1显示消息IDC_LIST1m_ctrMesssageEDIT2编辑要发送的消息IDC_EDIT2m_strMess表3.1 客户端对话框上控件的作用 服务器登陆窗口(如图3.11):图3. 11服务器登陆窗口服务器操作界面(如图3.12):图3. 12服务器操作界面服务器对话框上控件的功能如表3.2。控件功能ID标题VALUEBUTTON1打开服务器IDC_BUTTON1SERVERBUTTON2停止与客户端连接IDC_BUTTON2STOPBUTTON3发送消息IDC_BUTTON3SENDBUTTON4语音聊天IDC_BUTTON4PHONEBUTTON5更改用户权限IDC_BUTTON5CHANGEBUTTON6发送文件IDC_BUTTON6TransmissonBUTTON7停止接受文件IDC_BUTTON7Stop BUTTON8接收文件IDC_BUTTON8ReceiveBUTTON9设置字体IDC_BUTTON9FONTBUTTON10截图IDC_BUTTON10CaptureBUTTON11托盘IDC_BUTTON11HIDEPROGRESS1发送文件进度IDC_PROGRESS1 m_CtrlProgressSendLIST1显示消息IDC_LIST1m_ctlRecvdEDIT2编辑要发送的消息IDC_EDIT2m_strMsgSTATIC显示连接状态IDC_STATICSTATUSSTATIC2先是客户端IPIDC_STATIC2m_socketIP表3.2 服务器对话框上控件的功能 3、创建客户端和服务器端 创建的这两个类基类为CasyncSocket,类名为MySocket,向该类中添加一个成员变量,用作指向父对话框窗口的指针。指定变量类型为Cdialog*,变量名为m_pWnd 。还需要向该类中添加一个能设置指标的方法,因此添加一个成员函数。指定类型为void,函数声明为SetParent (CDialog* pWnd)。对于这个报路类还要做的是添加事件函数,要加入的事件函数为:客户端:void OnConnect(int nErrorCode) ;virtual void OnReceive(int nErrorCode);服务器:virtual void OnClose(int nErrorCode);virtual void OnReceive(int nErrorCode);virtual void OnAccept(int nErrorCode);添加了所有的函数后,应向对话框类添加一个报路类的变量,对于服务器的功能,在对话框类中需要两个变量,一个用于侦听连接请求,另一个用于被连接到另一个应用程序。变量名为m_ListenSocket和m_ConnectSocket。4、连接应用程序客户端与服务器的连接通过建立SOCKET套接字完成的,客户端进行连接,服务器进程侦听,如果在规定的时间内连接不上,或是网络问题,则系统自动退出,提示用户有错误发生;一旦建立连接,就可以通过以定义函数发送和接受消息,直到用户退出。具体操作如下:客户端:首先获取服务器的IP地址,输入后,点击CONNECT按钮,连接成功前不允许其它按钮能够工作,所以都设置位FALSE, 例如:GetDlgItem (IDC_BUTTON1)-EnableWindow(FALSE)设置按钮BUTTON1不能工作,由于对话框类CSocketDlg继承了CAsyncSocket类,消息响应函数里直接调用类成员Create(),Connect()即可,当连接到服务器后,自动调用OnConnect(),使对话框上各控件可以工作。 服务器端:类似于客户端,点击SERVER按钮,连接成功前不允许其它按钮能够工作,所以都设置位FALSE, 由于对话框类CMySeverDlg继承了CAsyncSocket类,消息响应函数里直接调用类成员Create(),Listen ()即可,其中调用Create()时需要制定端口(端口是一种抽象的软件结构,包括一些数据结构和IO缓冲区。应用程序即进程通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问),客户连接时也是通过这个指定的端口;当服务器侦听到客户端的连接后,自动调用OnAccept()函数,表示已经和客户端去的连接,使对话框上各控件可以工作;同时定义局部变量CString Cip 和UINT CPort,调用库函数GetPeerName()得到客户端IP和端口,并且能够在STATIC2上显示,GetDlgItem (IDC_STATIC2)-SetWindowText(Cip)。5、发送与接收消息这里有必要讲解一下阻塞套接字与非阻塞套接字。阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用receive ()函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在receive ()这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用receive ()函数读取网络缓冲

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论