毕业设计(论文)-基于Visual C的P2P文件传输系统的设计与实现_第1页
毕业设计(论文)-基于Visual C的P2P文件传输系统的设计与实现_第2页
毕业设计(论文)-基于Visual C的P2P文件传输系统的设计与实现_第3页
毕业设计(论文)-基于Visual C的P2P文件传输系统的设计与实现_第4页
毕业设计(论文)-基于Visual C的P2P文件传输系统的设计与实现_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计报告(论文)题目:基于VisualC++的P2P文件传输系统的设计与实现所属系计算机系_专业计算机科学与技术学号姓名指导教师起讫日期2021.22021.5设计地点南京网博_______东南大学成贤学院毕业设计报告〔论文〕诚信承诺本人承诺所呈交的毕业设计报告〔论文〕及取得的成果是在导师指导下完成,引用他人成果的局部均已列出参考文献。如论文涉及任何知识产权纠纷,本人将承当一切责任。学生签名:日期:P2P摘要P2P是peer-to-peer的缩写,或称为对等联网。P2P技术使得网络上的沟通变得容易,网络上现有的许多效劳可以归入P2P的行列。即时讯息系统如微软的MSNMessenger及国内的OICQ是最流行的P2P应用。由于它们都需要有位于中心的效劳器来协调,于是便有了编写本软件的设想。本软件功能摆脱了中心效劳器的束缚,是一个实用性通信软件。它的根本功能就是让用户能够在局域网甚至在广域网上点对点的进行交流。由于TCP/IP连接协议的效劳是设计客户端/效劳器应用程序时的主流标准,所以本软件主要采用TCP/IP协议的网络通信技术;客户端,效劳器类是从CAsyncSocket类中继承来的,因此本软件通信完全是异步的;程序在WindowsXP系统、VisualC++6.0下编译通过,并在WindowsNT100M以太网上运行良好。本软件创立的是对话框应用程序,采用多线程操作;连接后效劳器可以充当客户机,客户机也可以充当效劳器。它们可以在同一台计算机上,也可以把应用程序复制到另一台计算机上,这样没有中间效劳器存在,在两个独立的计算机上分别运行应用程序,从而通过网络传递消息。本软件主要完成了以下功能:根本文字聊天功能,传输文件功能,远程控制功能。还有语音聊天功能需要进一步改良,才能到达预期效果。在传输文件过程中,需要建立另一个进程,在新建的进程中传输文件,并且可以随时中断传输;远程控制功能主要是获取对方机器信息,获取对方进程,锁定和解锁键盘,锁定和解锁鼠标等关键词P2P;客户端;效劳器;通信;多线程

P2PAbstractP2Pistheacronymforpeer-to-peer,orcalledonothernetwork.P2Pnetworktechnologymakesthecommunicationeasier,andmanyexistingservicescanbeclassifiedasP2Pservice.InstantmessagingsystemssuchasMicrosoft'sMSNMessengeranddomesticOICQwasthemostpopularP2Papplication.Astheybothneedthecentralservertocoordinatetheserver,thereisthepreparationofthissoftwareconcept.Thissoftwareisapracticalcommunicationsoftware,asitfunctionsfromacentralserverconstrains.ItsbasicfunctionistoallowuserstotheLANorWANintheonlinepeer-to-peerexchange.AsTCP/IPagreementlinkingtheserviceisdesignedclient/serverapplicationproceduresforthemainstreamstandards,Therefore,thesoftwareusedmainlyTCP/IPagreementnetworkcommunicationtechnology;client,serverfromCAsyncSocketinheritedcategory,andthereforethesoftwareiscompletelyasynchronouscommuni-cation;proceduresinWindowsXPsystemandunderVisualC++6.0compiler,andisrunninggoodinWindowsNTand100MEthernet.Thissoftwarecreatesthedialogboxapplicationsthroughmulti-threadedoperation;afterconnectiontheservercanactasclient,Clientscanalsoactasservers.Theycanbeonthesamecomputer,canalsocopytheapplicationtoanothercomputer,bydoingsointermediateservernolongerexists.operatingapplicationsseparatelyintwocomputerssothatinformationisimpartedthroughthenetwork.Thesoftwarecompletedthefollowingmajorfunctions:basictextchat,filetransferfunctions,remotecontrolfunctions.Voicechatalsoneedtobefurtherimprovedinordertoachievethedesiredeffect.Transferfilesintheprocess,weneedtocreateanotherprocessinthenewprocesstotransferfiles,andtransmissioncanbeinterruptedatanytime;Remotecontrolfunctionisthemainaccesstoothermachinesofinformation,accesstoeachother'sprocess,lockandunlockthekeyboardandmouselockingandunlockingother.KeywordsP2P;client;Server;communication;multi-thread目录第一章绪论 11.1课题的主要内容和国内外开展方向 11.2软件的预期实现的目标和完成状况 2效劳器端的应用程序将完成如下功能 2客户端的通讯程序将完成如下功能 31.2.3目前的实现状况 3第二章通信方案的设计 42.1TCP与UDP协议的选择 42.1.1TCP协议 42.1.2UDP协议 52.2多线程编程 52.3WinInet编程与WinSock编程的比拟及其优点 62.4通信原理及过程 6第三章具体的设计方法 83.1根本的SOCKET函数 83.2通信过程 113.2.1C/S模式的请求响应方式 113.2.2SOCKET建立连接过程 12传输文件过程 13远程控制过程 143.3具体实现局部 15实现根本聊天的功能 15实现传输文件的功能 22截图 24语音通信 25远程控制 27第四章存在的问题及解决方法 31第五章后记 34第六章参考文献 35第七章致谢 36第一章绪论1.1课题的主要内容和国内外开展方向 P2P可以理解为“伙伴对伙伴〞的意思。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。2002年,尼古拉斯·曾斯特姆(NiklasZennstrom)把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.VanHouweling在他的中国之行时说到的:“下一代互联网民们将真正参与到网络中来,每个人都能为网络的资源和功能扩展作出自己的奉献。〞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软件的预期实现的目标和完成状况效劳器端的应用程序将完成如下功能——通过数据库验证用户名密码登陆——设置效劳器的账号——监听客户端的连接请求——为请求连接的客户端建立SOCKET队列——向客户端发送消息——从客户端接收消息——向客户端发送文件——从客户端接收文件——与客户端语音通信——截取屏幕——可以与客户端进行远程协助〔控制键盘鼠标进程〕客户端的通讯程序将完成如下功能——通过数据库验证用户名密码登陆——建立与效劳器的连接——关闭与效劳器的连接——向效劳器发送消息——从效劳器接收消息——向效劳器发送文件——从效劳器接收文件——与效劳器语音通信——截取屏幕——可以与效劳器进行远程协助〔控制键盘鼠标进程〕目前的实现状况由于这套软件采用VisualC++进行网络编程,同时还涉及到了数据库编程和VC++的多线程,为了使用户接口美观、使用方便,还需要采用编程的方法进行处理和美化,另外处理网络通信和用户信息交流还要建立各种辅助的数据结构和信息管理系统,所以需要处理的细节问题较多;此外,效劳器和客户端软件要分别编写,这样还牵扯到它们之间通信方案的制定,这样造成整套软件的编码工作量较大,所以整个软件的实现目标并未完全实现,主要是与数据库连接,语音聊天和界面的美工尚未完成。第二章通信方案的设计2.1TCP与UDP协议的选择TCP协议TCP/IP通常指的是关于TCP和IP的任何东西,它是一个统称,它既可以包括其它协议,其它应用程序,还可以包括网络介质。根本结构如图2.1,这个结构存在于Internet中计算机之中,它决定了计算机在网络上的动作。TELNETTELNETFTPSMTPDNSTCPUDPIPARPANETSATNETLAN协议网络应用层传输层网络层物理层和数链层图2SEQ图2\*ARABIC1TCP/IP模型中早期的协议和网络 如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP资料包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。TCP将它的信息送到更高层的应用程序,例如Telnet的效劳程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。面向连接的效劳〔例如Telnet、FTP、rlogin、XWindows和SMTP〕需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP协议发送和接收域名数据库,但使用UDP协议传送有关单个主机的信息。TCP协议即采用流式套接字SOCKET_STREAM。UDP协议UDP与TCP位于同一层,UDP不被应用于那些使用虚电路的面向连接的效劳,UDP主要用于那些面向查询应答的效劳,例如NFS。相对于FTP或Telnet,这些效劳需要交换的信息量较小。使用UDP的效劳包括NTP〔网落时间协议〕和DNS〔DNS也使用TCP〕。欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接〔也可以称为握手〕〔因为在两个系统间没有虚电路〕,也就是说,与UDP相关的效劳面临着更大的危险。UDP协议使用数据报式套接字SOCKET_DGRAM。虽然基于TCP/IP连接协议〔流套接字〕的效劳是设计客户机/效劳器应用程序时的主流标准,但有些效劳也是可以通过无连接协议〔资料报套接字〕提供的。先介绍一下TCPsocket与UDPsocket在传送数据时的特性:Stream(TCP)Socket提供双向、可靠、有次序、不重复的数据传送。Datagram(UDP)Socket虽然提供双向的通信,但没有可靠、有次序、不重复的保证,所以UDP传送数据可能会收到无次序、重复的数据,甚至数据在传输过程中出现遗漏。由于UDPSocket在传送数据时,并不保证数据能完整地送达对方,所以本程序采用TCP协议处理Socket,以保证数据的正确性。一般情况下TCPSocket的数据发送和接收是调用send()及recv()这两个函数来达成,而UDPSocket那么是用sendto()及recvfrom()这两个函数,这两个函数调用成功发挥发送或接收的数据的长度,否那么返回SOCKET_ERROR。2.2多线程编程由于用到对话框,所以单线程的操作会严重影响程序功能的实现,所以采用多线程操作,使得在翻开一个对话框时,不会影响到另一个对话框的功能,在MFC程序中创立一个线程,调用AfxBeginThread函数:CWinThreadAfxBeginThread(AFX_THREADPROCpfnThreadProc,控制函数LPVOIDpParam,传递给控制函数的参数intnPriority=THREAD_PRIORITY_NORMAL,线程的优先级UINTnStackSize=0,线程的堆栈大小DWORDdwCreateFlags=0,线程的创立标志LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL线程的平安属性);结束进程:进程只是提供了一段地址空间和内核对象,其运行是通过在其地址空间内的主线程来表达的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的去除。除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其它进程的运行。Exit-Process〔〕函数即可在进程中的某个线程中使用,并将立即终止本进程的运行。该函数具有强制性,在执行完毕后进程即已经被结束,因此位于其后的任何代码将不能被执行。虽然ExitProcess〔〕函数可以在结束进程的同时通知与其相关联的动态链接库,但是由于它的这种执行的强制性,使得ExitProcess〔〕函数在使用上将存在平安隐患。2.3WinInet编程与WinSock编程的比拟及其优点 1、网络编程简单使用WinSock编程,用户需要熟悉网络通信及TCP/IP和各种协议;而使用WinInet进行开发,就不需要了解具体实现协议,从而简化了网络编程。另外,WinInet函数的调用形式与多数Win32API函数类似,也便于用户掌握和使用。 2、程序维护简单,升级方便 Internet开展迅速,其各种协议也在不断开展与完善。WinInet隐藏了协议的具体的协议细节,使得应用程序不必直接实现协议,而只需要调用一个协议接口,这样在协议更新时,只要更新WinInet动态链接库即可,程序本身无须做任何修改。 3、性能优越,支持多线程WinInet函数支持多线程,可以在多线程中调用各种WinInet函数而不用担忧发生各种并发问题,WinInet函数在内部处理所有的多线程并发、死锁等问题。2.4通信原理及过程 大多数通过网络进行通信的应用程序,不管是通过因特网还是小型的办公网络,它们都使用同样的原那么和功能来执行通信。计算机上的一个应用程序正在等待另一个程序翻开通信连接,可以说这前一个应用程序正在“侦听〞该连接请求,这很像你在等待某人给你打时,一直在留心铃声。与时同时,另一个应用程序,一般是运行在另一台计算机上〔当然也可以是同一台机器上〕,试图同第一个应用程序连接。这种试图找开连接的方式就类似于向某人打。你拨了号码,并希望要找的那个人正在线的另一头等接。当然,要完成的呼叫,必须知道被呼叫方的号码。同样的道理,试图连接到第一个应用程序的这个程序也必须知道第一个应用程序的网络位置或网络地址。一旦两个应用程序建立了连接,它们之间就可以互相发送和接收消息。正像两个人打交谈一样,这个连接是一个双向的通道,即双方都可以发送消息。最后,如果一方或双方完成了对话,连接即关闭,就像打完一样,你能够知道中的对方是否把给挂断了,或者双方由于其它原因连接不上了。一旦该应用程序同一个应用程序之间建立了连接,就能够在它的对话框里键入要发送的文本消息,并把它们发送给另一个应用程序。消息被发送之后,就被加到已发送消息的列表中。接收到的每一条消息都被复制到所有已收到的消息列表中。这样就能看到完整的已发送和已接收到的消息列表,还可以对发送消息的应用程序和接收消息的应用程序进行比拟。这就是在两个或多个应用程序间进行网络通信的根本工作原理。第三章具体的设计方法3.1根本的SOCKET函数为了方便这种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)参数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。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.2通信过程3.2.1C/S模式的请求响应方式图3.SEQ图3.\*ARABIC1TCP/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状态,完成三次握手。完成三次握手,客户端与效劳器开始传送数据。SOCKET建立连接过程效劳器效劳器 客户端create(),建立套接字band(),与本地地址绑定listen(),准备好接受连接accept(),等待接受客户端连接,receive()接收数据Close(),关闭套接字send(),发送数据Create(),建立套接字Connect(IP),与效劳器连接receive()接收数据Close(),关闭套接字send()发送数据图3.SEQ图3.\*ARABIC2SOCKET建立连接过程效劳器创立套接字后,进行侦听,客户端创立套接字后进行连接,一旦建立连接,就可以发送接收数据,直到关闭套接字。传输文件过程自己中断自己中断效劳器客户端向客户端发送传输文件请求,等待等待效劳器的请求自己中断开始传输文件进程进程开始传输文件进程进程SOCKET建立连接并传输文件SOCKET建立连接并传输文件过程中断或对方的中断过程中断或对方的中断传输完毕,结束进程传输完毕,结束进程关闭连接,返回关闭连接,返回对方拒绝对方拒绝图3.SEQ图3.\*ARABIC3传输文件过程首先效劳器向客户端发送请求,要求传送文件,在得到客户端相应之前,双方都可以取消这次传输,同时通知对方已经取消连接;一旦客户端给了效劳器响应,那么建立进程,进行传输;建立的进程里,要定义新的SOCKET套接字,以建立连接,在传输过程中,同样可以进行中断,同时通知对方已经取消连接;传输结束后,断开连接,结束该进程。远程控制过程客户端效劳器已经建立了连接客户端效劳器已经建立了连接已经建立了连接发送远程控制请求接受远程控制请求修改注册表向对方发送结果接受结果信息判断命令类别退出退出图3.SEQ图3.\*ARABIC4远程控制过程首先客户端向效劳器发出请求,效劳器同意后建立连接,用户如果想执行某个功能,那么向效劳器发送消息,效劳器收到消息后根据标志字符判断属于哪项操作,然后作出相应操作,直到退出。3.3具体实现局部实现根本聊天的功能 1、创立应用程序创立一个对话框风格的应用程序,过程:设置工程名称和保存路径->选择“根本对话框〞->选择“WindowsSockets[W]〞->选择“WindowsSockets[W]〞->选择“作为静态的DLL〞或“作为共享DLL〞->完成。具体过程如以下图所示:①新建-〉工程-〉MFCAppWizard[exe],设置工程名称和保存路径〔如图3.5〕:图3.SEQ图3.\*ARABIC5设置工程名称和保存路径②下一步选择“根本对话框〞,点击下一步〔图3.6〕:图3.SEQ图3.\*ARABIC6选择“根本对话框〞③选择WindowsSockets[W],点击下一步〔图3.7〕:图3.SEQ图3.\*ARABIC7选择“WindowsSockets[W]〞④如果想在其它机器上脱离函数库运行,选择“作为静态的DLL〞,否那么默认的“作为共享DLL〞就行,点击完成〔如图3.8〕:图3.SEQ图3.\*ARABIC8选择“作为静态的DLL〞或“作为共享DLL〞 2、布置窗口和启动功能 对话框布局: ①客户端登陆窗口(如图3.9):图3.SEQ图3.\*ARABIC9客户端登陆窗口 ②客户端操作界面〔图3.10〕:图3.SEQ图3.\*ARABIC10客户端操作界面客户端对话框上控件的作用如表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_PROGRESS1m_CtrlProgressSendLIST1显示消息IDC_LIST1m_ctrMesssageEDIT2编辑要发送的消息IDC_EDIT2m_strMess表3.1客户端对话框上控件的作用 ③效劳器登陆窗口〔如图3.11〕:图3.SEQ图3.\*ARABIC11效劳器登陆窗口 ④效劳器操作界面〔如图3.12〕:图3.SEQ图3.\*ARABIC12效劳器操作界面 效劳器对话框上控件的功能如表3.2。控件功能ID标题VALUEBUTTON1翻开效劳器IDC_BUTTON1SERVERBUTTON2停止与客户端连接IDC_BUTTON2STOPBUTTON3发送消息IDC_BUTTON3SENDBUTTON4语音聊天IDC_BUTTON4PHONEBUTTON5更改用户权限IDC_BUTTON5CHANGEBUTTON6发送文件IDC_BUTTON6TransmissonBUTTON7停止接受文件IDC_BUTTON7StopBUTTON8接收文件IDC_BUTTON8ReceiveBUTTON9设置字体IDC_BUTTON9FONTBUTTON10截图IDC_BUTTON10CaptureBUTTON11托盘IDC_BUTTON11HIDEPROGRESS1发送文件进度IDC_PROGRESS1m_CtrlProgressSendLIST1显示消息IDC_LIST1m_ctlRecvdEDIT2编辑要发送的消息IDC_EDIT2m_strMsgSTATIC显示连接状态IDC_STATICSTATUSSTATIC2先是客户端IPIDC_STATIC2m_socketIP表3.2效劳器对话框上控件的功能 3、创立客户端和效劳器端创立的这两个类基类为CasyncSocket,类名为MySocket,向该类中添加一个成员变量,用作指向父对话框窗口的指针。指定变量类型为Cdialog*,变量名为m_pWnd。还需要向该类中添加一个能设置指标的方法,因此添加一个成员函数。指定类型为void,函数声明为SetParent(CDialog*pWnd)。对于这个报路类还要做的是添加事件函数,要参加的事件函数为: ①客户端: voidOnConnect(intnErrorCode); virtualvoidOnReceive(intnErrorCode); ②效劳器: virtualvoidOnClose(intnErrorCode); virtualvoidOnReceive(intnErrorCode); virtualvoidOnAccept(intnErrorCode);添加了所有的函数后,应向对话框类添加一个报路类的变量,对于效劳器的功能,在对话框类中需要两个变量,一个用于侦听连接请求,另一个用于被连接到另一个应用程序。变量名为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〔〕函数,表示已经和客户端去的连接,使对话框上各控件可以工作;同时定义局部变量CStringCip和UINTCPort,调用库函数GetPeerName〔〕得到客户端IP和端口,并且能够在STATIC2上显示,GetDlgItem(IDC_STATIC2)->SetWindowText(Cip)。 5、发送与接收消息 这里有必要讲解一下阻塞套接字与非阻塞套接字。阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否那么一直阻塞在此网络调用上,比方调用receive()函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在receive()这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比方调用receive()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S结构的软件就是异步非阻塞模式的。本软件也采用异步非阻塞模式,发送和接收消息是通过send()和receive()函数实现的,首先从编辑框里得到要发送的数据及其长度,然后调用send()发送给对方,同时可以接收来自对方的消息,具体操作如下: ①发送客户端:定义局部变量iLength表示发送数据长度,iSentmessage表连接状态,用字符串m_strMessage;编辑要发送的信息,用户将要发送的信息输入编辑框EDIT1,传递给变量m_strMess,在不是空字符串的情况下操作,首先将值赋予m_strMessage,用GetLength()计算其长度,然后调用Send函数,通过m_ConnectSocket.对象发送给对方;在连接没错误的情况下,取得系统时间,GetLocalTime(&tm),格式设置为“年/月/日时/分/秒〞Format("%y/%m/%d%H:%M:%S"),然后在自己对话框上显示已经发送的消息;最后将记录保存,fp=fopen("f:\\socket.txt","ab+")。效劳器端:定义局部变量iLength表示发送数据长度,iSentmessage表连接状态,用字符串m_strMessage;编辑要发送的信息,用户将要发送的信息输入编辑框EDIT1,传递给变量m_strMsg,在不是空字符串的情况下操作,首先将值赋予m_strMessage,用GetLength()计算其长度,然后调用Send函数,通过m_ConnectSocket.对象发送给对方;在连接没错误的情况下,取得系统时间,GetLocalTime(&tm),格式设置为“年/月/日时/分/秒〞Format("%y/%m/%d%H:%M:%S"),然后在自己对话框上显示已经发送的消息;最后将记录保存,fp=fopen("f:\\socket.txt","ab+")。 ②接收〔这是本程序的一个关键局部,一些文件的传输状态要靠这局部决定,但不是理想解决方案,主要是在传输文件时用到〕。 客户端:主要是调用函数.Receive接受对方的消息,然后根据对方发送的消息判断是否进行文件的传输等功能;例如:当接收到消息“效劳器停止工作〞时,m_bSendDataEnd设置为TRUE。 此时表示效劳器不再接收文件,然后客户端再根据这个消息作出下一步的动作,具体操作在讲到。 6、终止连接客户端:在断开连接前,向效劳器发送消息,能够通知效劳器自己已停止工作,然后各按钮false。效劳器:在断开连接前,向客户端发送消息,能够通知客户端自己已停止工作,然后各按钮false。实现传输文件的功能 由于考虑到网络问题,限制为发送文件时不能同时接收文件,接收时也不能发送文件。由按钮BUTTON6响应函数实现。 初始时要创立文件对话框dlg,如果用户在选择完要传送的档后按下ok〔或确定〕键的话,进行相关操作,否那么退出;按下ok后,向对方发送通知消息"效劳器要发送文件receiveorstop",让对方确定是接收还是拒绝,m_bSendStart一直是FALSE,因此执行while循环,不能开始创立发送文件线程;另外文件传送的过程可以随时结束,结束方式有4种情况:〔1〕在没传送之前:如果用户收到对方拒绝接受的消息“客户端拒绝传送〞,那么设置标志m_bSendStop位TRUE,发送方自动退出,不再传送文件;〔2〕在没传送之前:如果用户突然不想发送文件了,这是点击Stop按钮,消息响应函数使得m_bSendStop标志为true,这是中断while循环,自动退出,同时向对方发送消息〞效劳器停止传输〞;〔3〕在传送过程中:如果用户想中止,通过点击Stop按钮,这时由于是在传送过程中,故终止的函数设置m_bSendEnd为true;(在传送线程函数里没传送1k的文件就会循环询问一次m_bSendEnd是否为true),故在确定m_bSendEnd为true后,向对方发送消息"发送端终止",然后结束退出;〔4〕在传送过程中:如果对方中止,那么会受到消息“客户端接收终止〞,那么设置m_bRecEnd为TRUE,同样的在传送线程函数里没传送1k的文件就会循环询问一次m_bSendEnd是否为true,故在确定m_bSendEnd为true后,结束退出; 在没有任何终止消息的情况下,调用函数AfxBeginThread创立线程,开始发送文件:首先调用Open函数翻开要传送的文件,然后创立CSocket类的对象sockSrvr,开始另一个套接字,等待对方的连接;连接成功后,创立SSFI对象,来接收文件的信息,SSFI结构如下:typedefstructSSFI{//SOCKET_STREAM_FILE_INFO获取文件信息TCHARszFileTitle[128];//文件的标题名DWORDdwFileAttributes;//文件的属性FILETIMEftCreationTime;//文件的创立时间FILETIMEftLastAccessTime; //文件的最后访问时间FILETIMEftLastWriteTime;//文件的最后修改时间DWORDnFileSizeHigh;//文件大小的高位双字DWORDnFileSizeLow;//文件大小的低位双字DWORDdwReserved0;//保存,为0DWORDdwReserved1;//保存,为0}SSFI,*PSSFI;//对象和指针 定义变量dwRead,来累计传送字节数,初始为0,只要比要传送的文件小就进行循环传送;在循环过程中还要判断2种中断的方式是否发生,每次传送过程中都要分配1024字节的空间,来存储读入的文件流,sockRecv对象调用函数Send发送这些字节,每次还可以设置进度条,以观察传送的状况,百分比用GetDlgItem(IDC_STATIC1)->SetWindowText(str),进度条用m_CtrlProgressSend.SetPos(a),当然每次都是计算之后得到的数值;dwRead随着传送而增加,直到大于等于StreamFileInfo.nFileSizeLow时循环结束,进度条和百分比分数自动清零,结束进程,返回到原来状态〔传输过程的界面如图3.13〕。图3.SEQ图3.\*ARABIC13传输文件过程截图截取屏幕类CScreen的初始化:首先由矩形类CMyTracker的对象m_rectTracker设置矩形颜色RGB(0,0,255)蓝色,再由LoadCursor函数加载光标,GetSystemMetrics取得屏幕的像素,最后由CopyScreen-ToBitmap截取屏幕到位图,由CreateRectRgn函数初始化刷新窗口区域m_rgn,以显示动态信息,由OnCtlColor函数设置m_rgn内文本颜色; 鼠标在该截图上的操作具体由OnMouseMove实现,在这个函数里,SendMessage发送消息WM_MOUSEMOVE,触发CDialog类的OnMouseMove事件,然后再进一步得到鼠标的操作过程,如鼠标左键按下,鼠标左键抬起,左键双击,单击鼠标右键,不同动作有不同的处理方法:OnLButtonDown鼠标左键按下时,如果是第一次,那么m_bFirstDraw位false,此时画出最小的矩形,SetRect(point.x,point.y,point.x+4,point.y+4),然后再有此按用户需要画出矩形,最后PaintWindow;如果不是第一次按下,那么可以调整矩形的大小,以满足用户的需要,Track函数会自动调整矩形大小,在些期间,消息归CRectTracker内部处理;最后触发CDialog类的OnLButtonDown函数,得到鼠标的响应;OnLButtonUp鼠标左键抬起时,PaintWindow〔〕画出已确定的矩形,最后触发CDialog类的OnLButtonUp函数,得到鼠标的响应;OnLButtonDblClk如果在是矩形内部双击,CopyScreenToBitmap〔〕函数将画出的矩形拷贝到剪贴板上,最后触发CDialog类的OnLButtonDblClk函数,得到鼠标的响应;OnRButtonUp鼠标右键操作,如果是第一次按下,那么m_bFirstDraw位true,进行下面操作,如果已经截取矩那么去除截取矩形SetRect(-1,-1,-1,-1),否那么调用CDialog类的OnCancel()退出;⑵在m_rgn内显示动态信息——GetRValue可以得到屏幕像素的值,定义CString类的函数string,用来编辑可以显示的内容,最后由SetWindowText显示在该区域内;缺乏的地方是,目前还不能把截取的图像直接显示在编辑框。语音通信图3.SEQ图3.\*ARABIC14语音通信主界面当前计算机系统处理声音文件有两种方法:一是使用现成的软件,如微软的录音机、SoundForge、CoolEdit等软件可以实现对声音信号进行录音、编辑、播放的处理,但它们的功能是有限的,为了更灵活,更大限度地处理声音数据,就不得不使用另外一种方法,既利用微软提供的多媒体效劳,在Windows环境下自己编写程序来进行声音处理来实现一些特定的功能。Windows支持两种RIFF(ResourceInterchangeFileFormat,资源交互文件格式)格式的音频文件:MIDI的RMID文件和波形音频文件格式WAVE文件,其中在计算机领域最常用的数字化声音文件格式是后者,它是微软专门为Windows系统定义的波形文件格式〔WaveformAudio〕,由于其扩展名为.wav,因而该类文件也被称为WAVE文件。为了突出重点,有的放矢,本文涉及到的声音文件所指的就是WAVE文件。常见的WAVE语音文件主要有两种,分别对应于单声道〔11.025KHz采样率、8Bit的采样值〕和双声道〔44.1KHz采样率、16Bit的采样值〕。这里的采样率是指声音信号在进行模→数转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。对于单声道声音文件,采样数据为八位的短整数〔shortint00H-FFH〕;而对于双声道立体声声音文件,每次采样数据为一个16位的整数〔int〕,高八位和低八位分别代表左右两个声道。 要实现点对点语音通信,只要针对一个点实现话音的实时采集、处理、播放,同时能进行可靠的传送和接收,这样两点一连便可通话。对于前者,采用WindowsMDK的低层音频效劳比拟适宜,因为低层音频效劳中的回调机制为我们提供了很大的方便。当应用程序不断向设备驱动程序提供音频数据时,设备驱动过程控制音频设备在后台完成录音和放音的具体操作,通过回调机制,我们又可以检测到什么时候用完一个数据块,并及时传送下一个数据块,从而保证了声音的连续,有了这种单机上的实时采集、回放功能后,接下来的工作就是在网络上传送话音数据。在点对点网络传输方面,选择面向连接的TCP协议,TCP传输协议自动处理分组丧失和交付失序问题,这样我们不用为这些问题操心,只需很好地利用这个连接,在采集话音回放之前一方面将自己的话音传给网络,另一方面接收网络传来的话音,这样便实现了点对点语音通信。〔本程序还没有完全实现这个功能〕。 以下是本程序的实现过程: 初始时,分配两个缓冲区pBuffer1和pBuffer2,用于存储声音信息,大小为16384字节〔可自己设定〕,分配成功后,初始化WAVE波形的采集参数,声道设为1,采样率11025,数据位设为8位等。然后用waveInOpen函数翻开录音设备,以初始化WAVE波形的头信息,waveInPrepareHeader为录音设备准备缓存后,waveInAddBuffer/给输入设备增加一个缓存,开始录音,调用waveInStart函数,开始Audio_Listen_CThread和Audio_Send_CThread进程; ①Audio_Listen_CThread:声音文件接受线程 先定义CSocket类的对象m_Server,调用Create,Listen,等待对方连接,连接成功后,开始循环接收声音文件,首先接收文件长度,接下来开辟length长的内存空间,内存申请成功,可以进行循环检测接受,每轮声音文件接收完毕 后,都要检查是否地址越界;接受完毕后,关闭SOCKET连接; ②Audio_Send_CThread:声音文件发送线程 先定义CSocket类的对象m_Client,调用Connect函数,建立与对方的连接,循环检测发送声音文件,首先发送块的长度,其次发送块的内容;用dwSent表示已经发送的字节数,发送声音文件开始,每轮声音文件发送完毕后,都要检查是否地址越界;接受完毕后,关闭SOCKET连接;远程控制此功能类似于QQ的远程协助,但有很大的局限性,仅能够锁定或解锁对方键盘,鼠标,得到对方进程和杀死某个进程。对于每个功能,过程相似:首先客户端向效劳器发出请求,效劳器同意后建立连接,然后用户如果想执行某个功能,例如锁定鼠标,那么点击“锁定鼠标〞按钮,客户端向效劳器发送一个标志字符,通知效劳器要进行这项操作;效劳器收到消息后根据标志字符判断属于哪项操作,然后作出相应操作,对于“锁定鼠标〞,那么修改注册表项,使其无法工作,下面是操作主界面〔如图3.15〕:图3.SEQ图3.\*ARABIC15远程控制主界面对于具体的功能操作详细说明如下: 1、得到对方机器信息 客户端要向效劳器发送消息“I〞,效劳器收到并做出判断后,启动进程++:首先通过gethostname函数得到主机名strMsg;调用库函数GetSystemInfo得到系统信息:内存大小Memory,操作系统类型os,屏幕分辨率display等;最后向客户端发送标志“J〞,表示要发送的是系统信息,发送完后,关闭连接。在客户端,接收到“J〞后,做出判断,知道收到了系统信息,然后根据信息里的特征,区分出各种信息,在列表框中显示出来; 2、得到进程信息客户端要首先创立套接字sockClient,用于向效劳器发送请求消息,连接成功后,发送“P〞到对方,表示要得到进程信息,然后等待对方传送进程信息给自己;在成员函数ReceiveFileMsg中,判断效劳器向自己发送的是那种信息,如果是“P〞,那么表示是进程信息,此时,分配500字节的缓冲区buff,用于接受消息,将值传递给m_message,在编辑框IDC_MESSAGE内显示信息;本过程用到函数OnLookprc,和_LookPrcThread。效劳器端首先要通过收到的消息来判断进行那种操作,如果收到“P〞,那么开始进程LookPrc,开始监听进程,用CreateToolhelp32Snapshot函数得到进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD]〕建立一个快照snapshot,参数SNAPPROCESS表示在快照中包含系统中所有的进程,定义变量shSmal获得有关文件关联图标,变量ProcessInfo声明进程信息变量,然后用函数Process32First(SnapShot,&ProcessInfo)返回系统中第一个进程的信息;假设Status为真,进行循环,进程计数器m_nProcess累加,函数SHGetFileInfo获取进程文件信息,传给字符串prc;循环结束后,创立客户端套接字,连接到另一端,如果连接成功,那么发送"P"到对方,表示传送的是进程信息,然后传送进程信息pro给对方;本过程用到函数LookPrc,_LookPrcThread。对话框如图3.16。图3.SEQ图3.\*ARABIC16得到对方进程信息的界面 3、杀死对方进程客户端首先要定义变量PrcName表示要杀死的进程,鼠标在进程列表上点击要杀死的进程,用GetText函数可以得到进程名称,然后传递给变量PrcName,在确定要杀死该进程后,便启动进程_KissPrcThread;该进程首先与效劳器建立连接,然后向效劳器发送消息“E〞〔表示要进行杀死进程操作〕和要杀死的进程名PrcName,效劳器收到并判断出后,开始进程_KissPrc;首先得到进程快照snapshot,用Process32First函数返回系统中第一个进程的信息,结束进程用到TerminateProcess(hProcess,1);然后重新扫描系统进程,向客户端发送并显示当前的进程; 4、锁定和解锁键盘首先定义效劳器端的键盘注册表键值KEY_DisableTaskMgr客户端要向效劳器发送消息“K〞,效劳器初始设置LockOrUnLockKey为true,收到“K〞并判断出后,设置KeyMouse为TRUE,开始进程LockKeyBord;在函数里调用PostMessage(pDlg->GetSafeHwnd(),STATUS_MESSAGE,0,0);用GetSafeHwnd翻开平安窗口,将消息传递给STATUS_MESSAGE,然后调用Onkey函数进行具体操作;(1)如果KKeyBord和LockOrUnLockKey为TRUE,用RegOpenKey函数翻开注册表键KEY_DisableTaskMgr,然后RegSetValueEx修改VAL_DisableTaskMgr健值为1〔锁定键盘〕,LockOrUnLockKey取反;(2)如果KKeyBord为true且LockOrUnLockKey为false,那么修改VAL_DisableTaskMgr健值为0。过程中会弹出要修改注册表选项的对话框〔如图3.17〕:图3.SEQ图3.\*ARABIC17程序修改注册表的界面--锁定/解锁键盘 5、锁定和解锁鼠标首先定义效劳器端的键盘注册表键值Mouse_DisableTaskMgr。客户端要向效劳器发送消息“S〞,效劳器初始设置LockOrUnLockMouse为true,收到“S〞并判断出后,设置KeyMouse为TRUE,开始进程LockMouse;在函数里调用PostMessage(pDlg->GetSafeHwnd(),STATUS_MESSAGE1,0,0);用GetSafeHwnd翻开平安窗口,将消息传递给STATUS_MESSAGE1,然后调用OnMouse函数进行具体操作;(1)如果KeyMouse和LockOr-UnLockMouse为TRUE,用RegOpenKey函数翻开注册表键Mouse_Disable-TaskMgr,然后RegSetValueEx修改VAL_DisableTaskMgr健值为1〔锁定鼠标〕,LockOrUnLockMouse取反;(2)如果KeyMouse为true且LockOr-UnLockMouse为false,那么修改VAL_DisableTaskMgr健值为0。过

温馨提示

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

评论

0/150

提交评论