远程控制软件的设计与开发毕业设计论文.doc

上传人:文库蛋蛋多 文档编号:3994309 上传时间:2023-03-30 格式:DOC 页数:38 大小:240.50KB
返回 下载 相关 举报
远程控制软件的设计与开发毕业设计论文.doc_第1页
第1页 / 共38页
远程控制软件的设计与开发毕业设计论文.doc_第2页
第2页 / 共38页
远程控制软件的设计与开发毕业设计论文.doc_第3页
第3页 / 共38页
远程控制软件的设计与开发毕业设计论文.doc_第4页
第4页 / 共38页
远程控制软件的设计与开发毕业设计论文.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《远程控制软件的设计与开发毕业设计论文.doc》由会员分享,可在线阅读,更多相关《远程控制软件的设计与开发毕业设计论文.doc(38页珍藏版)》请在三一办公上搜索。

1、 毕业设计(论文)远程控制软件的设计与开发控制远程按键论文作者姓名:申请学位专业:申请学位类别:指导教师姓名(职称):论文提交日期:远程控制软件的设计与开发控制远程按键摘 要今天,许多企业和增值分销商正在把远程控制技术作为有效的技术支持工具,许多网络管理员都采用这类软件对局域网进行远程管理。远程管理软件对于出差在外的商务人员用处非常大,这样他们可以随时提取自己家里计算机中的数据和资料。本文介绍的软件用C+语言编写而成,能通过一台主机控制网络上的一台或多台远程主机的键盘。软件采用了C/S模式,即客户端/服务器端模式。客户端对服务器端进行监控操作,服务器端接收客户端传输的数据并进行分析和执行。本文

2、首先对远程控制软件的原理和WinSock技术作了介绍,最后阐述了如何利用 WinSock 控件与远程计算机建立连接,实现控制按键的功能。关键词: 套接字;客户端/服务器模式;远程控制;模拟按键The Design and Development of the Remote Control SoftwareRemote Keyboard ControllingAbstractToday, many enterprises and retail traders are using the remote control techniques as an effective technique sup

3、port tool, and many network administrators use such kind of software to remotely manage their LANs. Remote control software is also very useful to business persons for them to retrieve data and materials in their personal computers at home from any where and at any time. This software introduced in

4、the paper, was written with C + language and can control the keyboards of one or many remote computers on the network. The software adopts C/S pattern (Client/Server). The client side controls and operates the server, which receives the data transmitted from the client side and explains and carries

5、out the commands. This paper first introduces the principle of the remote control software and WinSock technology, then explains how to use WinSock to connect to the remote computer,and how to implement the keyboard controlling functions. Key word: Socket; Client/Server; Remote Controlling; Simulati

6、ng Keyboard Events目 录论文总页数:26页1.引言11.1 课题背景11.2 国内外研究现状11.3 本课题研究的意义11.4 本课题的研究方法12. 远程控制概述22.1 远程控制概念22.2 远程控制与其他程序的区别22.2.1 远程控制与病毒的区别22.2.2 远程控制与黑客的区别22.2.3 远程控制与木马的区别33. 控制远程按键的背景技术介绍33.1 Winsocket的介绍33.1.1 Socket的基本概念33.1.2 Winsocket33.2 客户端/服务器(C/S)模式34.控制远程按键程序的需求分析44.1控制远程按键的需求分析44.2控制远程按键的流

7、程分析45 远程按键控制的实现55.1 使用Winsocket建立控制端和被控制端连接55.1.1 初始化Winsock55.1.2 创建套接字65.1.3 指定本地地址75.1.4 建立套接字连接75.1.5 监听连接95.1.6 关闭套接字95.2 按键事件处理95.2.1 数据传输95.2.2 模拟按键105.3具体代码10结 论23参考文献24致 谢25声 明261.引言1.1 课题背景我们知道,通常企业内部或者IT公司的客户技术支持部门都有技术支持业务,其任务是通过电话解答疑难问题,努力减少技术人员到现场服务或者让用户把设备送到支持中心进行维护。这种技术支持方式尽管被普遍采用,但效率

8、不高而且大大增加了技术支持成本。 通常,技术支持必须依赖技术人员和用户之间的口头交流来进行,这种交流既耗时又容易出错。许多商业用户对计算机知之甚少,然而当遇到问题时,他们必须向技术人员提供故障情报及相关操作。在尝试解决问题时,技术人员可能指导用户执行一系列复杂的过程,而这些过程对用户来说或许完全不熟悉;如果用户不能正确的按要求操作,反而使问题恶化。此外,如果通过电话不能解决问题,那么技术人员亲自到用户现场解决问题之前,计算机将一自不能使用。远程控制软件能使技术人员直接操作远程计算机,就像操作本地机器一样,无须用户介入,技术人员技能得到该机器的问题的第一手材料,从而加快了问题的解决。实际上,使用

9、远程控制工具的技术人员能够做到解答疑难问题,安装和配置软件,把软件下载到用户计算机上,配置应用程序和系统软件设置并可通过实际操作培训用户。1.2 国内外研究现状根据IDC统计,美国远程控制软件市场从1998年的6.77亿美元发展到2002年的19亿美元,年增长率达31.5%,是软件技术支持消费中第3个增长最快的领域。国内的远程控制软件发展也比较乐观,出现了许多优秀的软件,比如大家都比较熟悉的“冰河”,“灰鸽子”等。1.3 本课题研究的意义远程控制软件已经使用很多年了,起初是为了让PC用户在离开办公室的时候能访问其台式PC硬盘中的信息,甚至可以通过其台式PC访问企业网络资源。今天,许多企业和增值

10、分销商正在把远程控制能力作为有效的技术支持工具。许多网络管理员都采用这类软件对局域网进行管理或者在自己家更新自己网站的内容。这类软件对于出差在外的商务人员用处非常大,这样他们可以随时提取自己家里计算机中的数据和资料。1.4 本课题的研究方法本软件用C+语言编写,采用的是C/S结构,一个客户端,一个服务器端。客户端是控制端,服务器端是被控制端。主要功能就是通过本地计算机,控制远程另一台计算机的键盘。主要思路是先用Winsocket建立两边的连接,客户端向服务器端发送键码,服务器端得到键码后模拟出按键事件。 2. 远程控制概述2.1 远程控制概念对于远程控制软件的定义有很多种。我们认为,远程控制指

11、管理人员在异地通过计算机网络(WAN),异地拨号或双方都接入Internet等手段,连接目标计算机,通过本地计算机对远程计算机进行管理和维护的行为。远程控制软件实际上是一种客户机/服务器程序,服务器程序安放在被控制的计算机端,客户机安装在控制端。在客户端和服务器端都安装成功之后,客户端在网络上搜寻已经安装了服务器的远程计算机;然后,客户端就发指令获得服务器端的连接指令,两台PC建立起连接,就可以通过网络的互连协议TCP/IP进行远端控制。远程控制的原理很简单:在本机上直接启动运行的程序,拥有与使用者(客户端)相同的权限。因此如果能够启动服务器端的服务程序,就可以使用相应的客户端程序直接控制主机

12、了。也就是说客户端就好比一个超级用户,可以直接控制计算机。2.2 远程控制与其他程序的区别远程控制软件可以为我们的网络管理工作做很多工作,以保证网络和计算机操作系统的安全。这类程序的监听功能,也是为了保证网络的安全而设计的,但是如果使用不当的话,就会出现很多的问题。为了达到远程控制的目的,就必须将这些软件隐蔽起来。例如有的远程控制软件为了不让用户发现而被删除,就采用了一些办法让自己隐蔽起来,使远程控制程序本身附着在某些Windows程序上,以增强驻留系统的可靠性。然而,正是由于这种功能,才使远程控制软件变得可怕起来,也使远程控制软件,病毒和黑客程序之间的区别变得越来越模糊。2.2.1 远程控制

13、与病毒的区别计算机病毒是能通过某种途径潜伏在计算机存储介质(或程序)里,当达到某种条件时即被激活的具有对计算机资源进行破坏作用的一种程序或指令集合。计算机病毒一般具有破坏性,隐蔽性,潜伏性,传染性等特点。从计算机病毒的定义和特征中可以看出,远程控制软件与病毒的区别是十分明显的。最基本的区别就在于病毒有很强的传染性,而远程控制软件没有。但是,如果远程控制软件没有好的处理好软件的安全问题,就会跟病毒相差无几了。2.2.2 远程控制与黑客的区别“黑客”一词来源于英语单词hack,本指“手法巧妙,技术高明的恶作剧”。今天,在最新和最普遍的意思上说,“黑客”意味着那些偷偷地,未经许可就进入别人计算机系统

14、的计算机犯罪。他们或修改网页搞恶作剧或散布流言进行恐吓,或破坏系统程度,施放病毒使系统险入瘫痪,或窃取政治,军事与商业机密,或进行电子邮件骚扰,或转移资金帐户,窃取钱财,真所谓作案方式多样,花样翻新,令人防不胜防。由此可见,远程控制与黑客的区别是较大的。黑客往往利用操作系统和网络的漏洞进行破坏活动,而远程控制软件的一大任务就是要保护控制端计算机,使之不受非授权用户的访问。当然,如果编写远程控制软件的唯一目的就是为了盗窃人家计算机上的隐私,这样的远程控制软件就不再是有用的软件而是恶性的黑客程序了。2.2.3 远程控制与木马的区别木马是一种在远程计算机之间建立起连接,使远程计算机能够通过网络控制本

15、地计算机的程序。它的运行遵循TCP/IP协议。由于它像间谍一样潜入用户的电脑,为其他人的攻击打开后门,与战争的“木马”战术十分相识,因而得名木马程序。木马与远程控制软件的最大区别就是木马具有隐蔽性而远程控制软件没有。3. 控制远程按键的背景技术介绍3.1 Winsocket的介绍3.1.1 Socket的基本概念实际上,Socket在计算机中提供了一个通信端口(套接口)。通过这个端口,一台计算机可以与任何一台具有Socket接口的计算机通信。通信的基础是套接口,一个套接口是通信的一端,在这一端上可以找到与其对应的一个名字。一个正在被使用的套接口都有他的类型和与其相关的进程,套接口存在于通信域中

16、。一个套接口通常和同一个域中的套接口交换数据(数据交换也可以穿越域的界限,但这时一定要执行某种解释程序)。应用程序在网络上传输,接收的信息都通过这个套接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读写操作。3.1.2 Winsocketwindows Socket(WinSock)API是基于BSD版本的套接字,但只为Windows进行了专门的扩展。此外,WinSock2.0能支持许多网络协议,包括TCP/IP,DEC Net和Novell的IPX/SPX等。Windows套接字规范是一个由几家开发商支持的接口规范。每个开发商都提供了他们自己的DLL来和传输栈一起工作

17、。3.2 客户端/服务器(C/S)模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(Client/Server)。即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源,运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程见既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。

18、4.控制远程按键程序的需求分析4.1控制远程按键的需求分析本程序的主要作用是控制服务器端的按键。当客户端发生键盘按键事件时,服务器端能够得到键码,实现按键的模拟。主要由以下几部分构成:(1) 实现使用WinSocket建立客户端和服务器端连接。要想实现远程控制,首先就要实现远程的互连。用WinSocket将客户端和服务器端连接起来后,服务器端才可以得到控制端的信息。(2) 控制端发送键码。当客户端与服务器端连接好以后,客户端要想控制服务器端的按键,必须要向服务器端发送与键盘按键对应的键码,服务器端得到了这个键码后才可以做出按键的模拟。(3) 实现服务器端模拟按键事件。服务器端在得到客户端传来的

19、键码后,根据键码做出正确的按键模拟,实现控制远程按键的功能。 4.2控制远程按键的流程分析图1 控制远程按键流程分析图5 远程按键控制的实现5.1 使用Winsocket建立控制端和被控制端连接首先,客户端和服务器端都要创建一个数据套接字。接着,服务器调用bind()函数给套接字分配一个公认的端口。这样,客户端和服务器端就使用同样的端口来表示服务器套接字。一旦服务器将公认端口分配给了套接字,客户端和服务器端就都能使用sendto()和recvfrom()来发送和接收数据报直到完成传递。然后调用close socket来关闭套接字。5.1.1 初始化WinsockWSAStartup()函数的原

20、型声明如下:Int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData );该函数共有两个参数。一个参数是一个WORD(双字节)型数值,他指应用程序中要使用的WinSock规范的最高版本。其中主版本在低位字节,副版本号在高位字节。第二个参数指一个指向WSDATA结构的指针,该结构的定义如下:Typedef struct WSAData WORD wVersion; WORD wHighVersion; Char szDescriptionWSADESCRIPTION_LEN+1; Char szSyestemStatusWSASYS_

21、 STATUS_LEN+1; Unsigned short iMaxSocket; Unsigned short iMaxUdpDg; Char FAR * IpVendorInfo;WSADATA,FAR * LPWSADATA 其中成员wVersion指Windows Sockets的版本号。成员wHighVersion指Windows Sockets的最高版本。通常情况下,该成员的取值与成员wVersion相同。成员szDescrpition指Windows Sockets实现的句柄字符串。成员szSystemStatus指Windows Sockets的配置信息或相关状态。成员iMax

22、Sockets,iMaxUdpDg和lpVendorInfo保留;在Windows Socket2及以后的版本中被忽略。我们一般采用如下代码来调用WSAStartup():# include/对应winSock 2,应该包含winsock2.hWSADATA WSAData;If (WSAStartup(0x0101,&WSAData)/初始化winSock时发生错误MessageBox(“不能加载windows套接字动态连接库”,“远程控制”,MB_OK);Return;if(WSAData.wVersion!=0x0101)/支持版本无效,报告后终止return;这时,如果WinSock.

23、dll或底层网络子系统没有正确初始化或没有找到,WSAtartup()将返回WSASYSNOTREADY。此外,这个函数允许应用程序协商使用某种版本的WinSock规范。通常在调用WSAStarup()时,我们应该指定想使用的WinSock最高版本。如果这个版本比任何DLL支持的版本低,WSAStartup()将返回WSAVERNOTSUPPORTED。如果我们要求的版本高于或等于DLL(动态链接库)所支持的版本。WSAData的wVersion成员将包含应用程序应该使用的版本。而wHighVersion成员中将包含DLL所支持的最高版本号。如果返回到wVersion成员的版本号不能被应用程序

24、所接受,我们就应该调用WSACleanup()并退出引用程序,或找一个不同的WinSock32.DLL来试一试。当然,这时需要动态加载新的DLL,并从中调用WSAStartup ()。5.1.2 创建套接字任何应用程序在使用套接字之前,首先必须拥有一个套接字,系统调用socket函数向应用程序提供创建套接字的手段。Socket()函数的原型声明如下:SOCKET PASCAL FAR socket (int af,int type ,int protocol);该函数共有3参数,其中参数af指定通信发生的区域。UNIX系统支持的地址簇有AF_UNIX,AF_INET,AF_NS等。而DOS,W

25、indows中仅支持AF_INET,它是网际网区域。参数type 描述建立的套接字类型。也就是指流式套接字还是数据报套接字。参数protocol说明该套接字使用的特定协议,如果该参数设为0。则表示使用默认的连接模式。Socket()函数根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字句柄。5.1.3 指定本地地址当一个套接字用socket()创建后,存在一个名字空间(地址簇),但它没有被命名。Bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字编号联系起来,即将名字赋予套接字。bind()函数的原型声明如下:int PASCAL FAR bin

26、d (SOCKER s,const struct sockaddr FAR *name,int namelen);bind()函数共有3个参数,其中参数s是由socket()函数调用返回的并且未作连接的套接字句柄。参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。参数namelen指参数name 的长度。如果调用成功,bind ()函数返回0;否则,返回SOCKER_ERROR。地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确的认识。例如,UNIX BSD有一组描述套接字地址的数据结构,其中使用TCP/IP协议的地址

27、结构为:struct sockaddr_in short sin_family; /* AF_INET*/ u_short sin_port: /*16位端口号,网络字节顺序*/ struct in_addr sin_addr; /*32位IP地址,网络字节顺序*/ char sin_zero8; /*保留*/5.1.4 建立套接字连接建立套接字连接需要使用两个函数。即connect()与accept()。这两个函数用于完成一个完整相关的建立,其中connect()用于建立连接。无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这

28、样做的优点是程序员不必为每一数据指定目的地址,而且如果收到一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端口不可操作。Accept()用于使服务器等待来自某客户进程的实际连接。Connect()函数的原型声明如下:int PASCAL FAR connect(SOCKER s,const struct sockaddr FAR *name,int namelen);Connect()函数共有3个参数,其中参数s指要建立连接的本地套接字句柄。参数name指对方套接字地址结构的指针,对方套接字地址长度由参数namelen说明。如果调用成功,connect()函数返回0;否则,返回SO

29、CKET_ERROR。在面向连接的协议中,该函数调用导致本地系统和外部系统之间连接的实际建立。由于地址簇总被包含在套接字地址结构的前两个字节中,并通过socket()函数调用某个协议簇相关。因此bind()和connect()不需要协议作为参数。Accept()函数的原型声明如下:SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR* addr,int FAR*addrlen);该函数也有3个参数,其中参数s为本地套接字句柄,在用做accept()函数调用的参数前应该先调用listen()。参数addr是指向客户方套接字地址结构的指针,用来

30、接收连接实体的地址。Addr的确切格式由套接字创建时建立的地址簇决定。参数addlen为客户方套接字地址的长度(字节数)。如果调用成功,accept()函数返回一个SOCKET类型的值,表示接收到的套接字的句柄;否则,返回INVALID_SOCKET。Accept()用于面向连接的服务。参数addr和addrlen存放客户方的地址信息。调用前,参数addr指向一个初值为空的地址结构,而addrlen的初始值为0;调用accepet()函数后,服务器等待从编号为s的套接字上接受客户连接的请求,而连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队

31、列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同性质的新套接字号。新的套接字可用于处理服务器并发请求。Socket(),bind(),connect(),accept()这4个套接字系统调用可以完成一个完整五元通信(协议,本地主机地址和端口号,目的地址和端口号)相关的建立。Socket()指定五元组中的协议元,它的用法与是否为客户机或服务器,是否面向连接无关。Bind()指定五元中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关;在服务器方无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过conne

32、ct()自动完成。若采用无连接,客户方必须使用bind ()以获得一个唯一的地址。5.1.5 监听连接建立连接之后,服务端套接字要调用listen()函数,此调用用于面向连接服务器,表明它愿意接收连接。Listen()需在accept()之前调用,listen ()函数的原型声明如下:int PASCAL FAR listen(SOCKET s, int backlog);该函数共有两个参数,其中参数s标识一个本地已建立但尚未连接的套接字句柄,服务器愿意从它上面接受请求。参数backlog表示请求连接队列的最大长度,用于限制排队请求的个数。目前允许的最大值为5。如果调用成功,listen()函

33、数返回零;否则,返回SOCKET_ERROR。Listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。调用listen()是服务器接收一个连接请求的4个步骤中的第3步。它在调用socket(),分配一个流套接字且调用bind()给s赋予一个名字之后调用,而且一定要在accept()之前调用。5.1.6 关闭套接字closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接。则该连接被释放。Closesocket()函数的原型声明如下:BOOL PASCAL FAR closesocke

34、t(socker s);该函数只有一个参数s,它指待关闭的套接字句柄。如果调用成功,closesoker()返回零;否则,返回SOCKET_ERROR。5.2 按键事件处理5.2.1 数据传输当一个连接建立好以后,就可以传输数据了,常用的函数调用有send()和recv()。Send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,其原型声明如下:Int PASCAL FAR send(SOCKET s,const char FAR *buf,int len,int flags);该函数也有4个参数,其中参数s为已连接的套接字句柄。参数buf指向接收输入数据缓冲区的指针,其长度

35、由len指定。参数flags指定传输控制方式,如是否接收带外数据等。如果调用成功,recv()函数返回总共接收的字节数;如果连接被关闭,返回零。否则,返回SOCKET ERROR。为了从套接字中接受数据,可以使用recv()函数。其函数原型声明如下:int recv (SOCKET s, char FAR * buf , int len,int falgs):recv()函数有4个参数,其中参数s指套接字句柄。参数buf和len分别指将要接收数据的缓冲区及缓冲区长度。参数flags可被设置成MSG-OOB,用来接收带外数据,或设置成MSG-PEEK用来向缓冲区填入收到的数据,而且仍按照数据的输

36、入顺序进行填充。对套接字来说,如果数据是按输入的队列接收过来的,recv()函数将返回读入数据的字节数,否则,recv()将返回SOCKETERROR。5.2.2 模拟按键函数keybd_event()综合一个按键事件,系统用这个事件产生WM_KEYUP或WM_KEYDOWN消息.在WindowsNT下,该函数被SendInput()所代替.函数keybd_event()的原型如下:VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtraInfo);函数keybd_event()有4个参数,其中参数bVk指所按键的虚拟键值

37、.取值范围在1至254之间。常见的特殊键值有:Tab(9),Shift(16),Ctrl(17),Alt(18),CapsLock(20),Esc(27), Win(91,92),NumLock(144)及ScrollLock(145)等.参数bScan指所按键的扫描码。参数dwFlags指函数操作标志位集合,应用程序可以检测这个值。它可以取以下值。KEYEVENTF_EXTENDEDKEY:如果指定该值,则键盘扫描码加一个前缀(224)。KEYEVENTF_KEYUP:如果指定该值,则键释放,否则,键一直被按下。参数dwExtralnfo指向一个附加的与键值有关联的32位值。5.3具体代码由

38、于篇幅有限,这里只列出了部分重要代码。服务器端套接字的创建,绑定,连接:char chName256;sockaddr_in addr;hostent* pEnt = NULL;int addrlen = 0, nRet = 0;nRet = :gethostname(chName, 256);if(nRet = 0)m_sckServer = socket(AF_INET, SOCK_STREAM, 0);if(m_sckServer != INVALID_SOCKET)pEnt = :gethostbyname(chName);if(pEnt)addr.sin_family = AF_IN

39、ET;addr.sin_port = htons(m_uPort);addr.sin_addr.s_addr = INADDR_ANY;nRet = :bind(m_sckServer, (sockaddr*)&addr, sizeof(addr);if(nRet != SOCKET_ERROR)nRet = :listen(m_sckServer, SOMAXCONN);if(nRet != SOCKET_ERROR)addrlen = sizeof(addr);TRACE(_T(开始了服务,等待客户.n); m_sckClient0 = :accept(m_sckServer, (sock

40、addr*)&addr, &addrlen); if(m_sckClient0 != INVALID_SOCKET) /为了同步 :PL_SendSocketData(m_sckClient0, NULL, 0, PL_TEMP, MSG_OOB); m_sckClient1 = :accept(m_sckServer, (sockaddr*)&addr, &addrlen); if(m_sckClient0 != INVALID_SOCKET & m_sckClient1 != INVALID_SOCKET) TRACE(_T(客户连接上了.n);服务器端关闭套接字:BOOL CSocket

41、Thread:ExitServer()TRACE(_T(退出服务,重新等待连接.n);if(g_pSendDIBThread != NULL):TerminateThread(g_pSendDIBThread-m_hThread, 0);:WaitForSingleObject(g_pSendDIBThread-m_hThread, INFINITE);g_pSendDIBThread = NULL;if(g_pWaitCommandThread != NULL):TerminateThread(g_pWaitCommandThread-m_hThread, 0);:WaitForSingle

42、Object(g_pWaitCommandThread-m_hThread, INFINITE);g_pWaitCommandThread = NULL;if(m_sckClient0 != INVALID_SOCKET):closesocket(m_sckClient0);if(m_sckClient1 != INVALID_SOCKET):closesocket(m_sckClient1);if(m_sckServer != INVALID_SOCKET):closesocket(m_sckServer);m_sckClient0 = INVALID_SOCKET;m_sckClient1

43、 = INVALID_SOCKET;m_sckServer = INVALID_SOCKET;return TRUE;服务器端接收客户端发送的指令:int WINAPI PL_ReadSocketData(SOCKET s, BYTE *chData, int nLen, BYTE *chFlag, UINT uFlag)int nRet = INVALID_SOCKET;if(s != INVALID_SOCKET)nRet = :recv(s, (char *)chData, nLen, uFlag);if(nRet 0)if(chFlag != NULL)*chFlag = chData

44、0; return nRet;服务器端处理指令:int CSocketThread:Run()g_pSendInfoThread=AfxBeginThread(SendInfoThread,NULL,THREAD_PRIORITY_IDLE);while(1) if(CreateServer() BYTE *chData = new BYTEPL_SOCKET_MAXBYTES+1;while(1)ZeroMemory(chData, PL_SOCKET_MAXBYTES+1);Int nRet=:PL_ReadSocketData(m_sckClient0, chData, PL_SOCKE

45、T_MAXBYTES, NULL);if(nRet != SOCKET_ERROR)/ 处理命令nRet = DoReceive(chData, nRet);elseTRACE(_T(接收数据错误,客户已经断开了.n);break ;delete chData;chData = NULL;ExitServer();return ExitInstance();int CSocketThread:DoReceive(BYTE *chData, int nLen)int nRet = 0;switch(chData0)/第一个字符为命令case PL_PEEPER_VER:/取服务端版本char chTe

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号