毕业设计(论文)-远程控制软件的开发与应用.doc_第1页
毕业设计(论文)-远程控制软件的开发与应用.doc_第2页
毕业设计(论文)-远程控制软件的开发与应用.doc_第3页
毕业设计(论文)-远程控制软件的开发与应用.doc_第4页
毕业设计(论文)-远程控制软件的开发与应用.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

远程控制软件的开发与应用远程控制软件的开发与应用 摘摘 要要 今天,许多企业和增值分销商正在把远程控制技术作为有效的技术支持工 具,许多网络管理员都采用这类软件对局域网进行远程管理。远程管理软件对 于出差在外的商务人员用处非常大,这样他们可以随时提取自己家里计算机中 的数据和资料。本文介绍的软件用 c+语言编写而成,能通过一台主机控制网 络上的一台或多台远程主机的键盘。软件采用了 c/s 模式,即客户端/服务器端 模式。客户端对服务器端进行监控操作,服务器端接收客户端传输的数据并进 行分析和执行。本文首先对远程控制软件的原理和 winsock 技术作了介绍,最 后阐述了如何利用 winsock 控件与远程计算机建立连接,实现控制按键的功能。 关键词关键词: 套接字;客户端/服务器模式;远程控制;模拟按键 591 论文网 www.591lw.com the design and development of the remote control software remote keyboard controlling abstract today, many enterprises and retail traders are using the remote control techniques as an effective technique support 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 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 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; simulating keyboard events 591 论文网 www.591lw.com 目目 录录 论文总页数:26 页 1.引言1 1.1 课题背景1 1.2 国内外研究现状1 1.3 本课题研究的意义1 1.4 本课题的研究方法1 2. 远程控制概述.2 2.1 远程控制概念2 2.2 远程控制与其他程序的区别2 2.2.1 远程控制与病毒的区别2 2.2.2 远程控制与黑客的区别2 2.2.3 远程控制与木马的区别3 3. 控制远程按键的背景技术介绍.3 3.1 winsocket的介绍3 3.1.1 socket 的基本概念 .3 3.1.2 winsocket.3 3.2 客户端/服务器(c/s)模式3 4.控制远程按键程序的需求分析4 4.1 控制远程按键的需求分析 4 4.2 控制远程按键的流程分析 4 5 远程按键控制的实现5 5.1 使用 winsocket建立控制端和被控制端连接 .5 5.1.1 初始化 winsock 5 5.1.2 创建套接字6 5.1.3 指定本地地址7 5.1.4 建立套接字连接7 5.1.5 监听连接9 5.1.6 关闭套接字9 5.2 按键事件处理9 5.2.1 数据传输9 5.2.2 模拟按键.10 5.3 具体代码 .10 结 论.23 591 论文网 www.591lw.com 参考文献.24 第 2 页 共 26 页 1.1.引言引言 1.11.1 课题背景课题背景 我们知道,通常企业内部或者 it 公司的客户技术支持部门都有技术支持业 务,其任务是通过电话解答疑难问题,努力减少技术人员到现场服务或者让用 户把设备送到支持中心进行维护。这种技术支持方式尽管被普遍采用,但效率 不高而且大大增加了技术支持成本。 通常,技术支持必须依赖技术 人员和用户之间的口头交流来进行,这种交流既耗时又容易出错。许多商业用 户对计算机知之甚少,然而当遇到问题时,他们必须向技术人员提供故障情报 及相关操作。在尝试解决问题时,技术人员可能指导用户执行一系列复杂的过 程,而这些过程对用户来说或许完全不熟悉;如果用户不能正确的按要求操作, 反而使问题恶化。此外,如果通过电话不能解决问题,那么技术人员亲自到用 户现场解决问题之前,计算机将一自不能使用。 远程控制软件能使技术人员直接操作远程计算机,就像操作本地机器一样, 无须用户介入,技术人员技能得到该机器的问题的第一手材料,从而加快了问 题的解决。实际上,使用远程控制工具的技术人员能够做到解答疑难问题,安 装和配置软件,把软件下载到用户计算机上,配置应用程序和系统软件设置并 可通过实际操作培训用户。 1.21.2 国内外研究现状国内外研究现状 根据 idc 统计,美国远程控制软件市场从 1998 年的 6.77 亿美元发展到 2002 年的 19 亿美元,年增长率达 31.5%,是软件技术支持消费中第 3 个增长最 快的领域。 国内的远程控制软件发展也比较乐观,出现了许多优秀的软件,比如大家 都比较熟悉的“冰河” , “灰鸽子”等。 1.31.3 本课题研究的意义本课题研究的意义 远程控制软件已经使用很多年了,起初是为了让 pc 用户在离开办公室的时 候能访问其台式 pc 硬盘中的信息,甚至可以通过其台式 pc 访问企业网络资源。 今天,许多企业和增值分销商正在把远程控制能力作为有效的技术支持工具。 许多网络管理员都采用这类软件对局域网进行管理或者在自己家更新自己网站 的内容。这类软件对于出差在外的商务人员用处非常大,这样他们可以随时提 取自己家里计算机中的数据和资料。 1.41.4 本课题的研究方法本课题的研究方法 本软件用 c+语言编写,采用的是 c/s 结构,一个客户端,一个服务器端。 客户端是控制端,服务器端是被控制端。主要功能就是通过本地计算机,控制 远程另一台计算机的键盘。主要思路是先用 winsocket 建立两边的连接,客户端 第 3 页 共 26 页 向服务器端发送键码,服务器端得到键码后模拟出按键事件。 2.2. 远程控制概述远程控制概述 2.12.1 远程控制概念远程控制概念 对于远程控制软件的定义有很多种。我们认为,远程控制指管理人员在异 地通过计算机网络(wan) ,异地拨号或双方都接入 internet 等手段,连接目标 计算机,通过本地计算机对远程计算机进行管理和维护的行为。 远程控制软件实际上是一种客户机/服务器程序,服务器程序安放在被控制 的计算机端,客户机安装在控制端。在客户端和服务器端都安装成功之后,客 户端在网络上搜寻已经安装了服务器的远程计算机;然后,客户端就发指令获 得服务器端的连接指令,两台 pc 建立起连接,就可以通过网络的互连协议 tcp/ip 进行远端控制。 远程控制的原理很简单:在本机上直接启动运行的程序,拥有与使用者 (客户端)相同的权限。因此如果能够启动服务器端的服务程序,就可以使用 相应的客户端程序直接控制主机了。也就是说客户端就好比一个超级用户,可 以直接控制计算机。 2.22.2 远程控制与其他程序的区别远程控制与其他程序的区别 远程控制软件可以为我们的网络管理工作做很多工作,以保证网络和计算 机操作系统的安全。这类程序的监听功能,也是为了保证网络的安全而设计的, 但是如果使用不当的话,就会出现很多的问题。为了达到远程控制的目的,就 必须将这些软件隐蔽起来。例如有的远程控制软件为了不让用户发现而被删除, 就采用了一些办法让自己隐蔽起来,使远程控制程序本身附着在某些 windows 程序上,以增强驻留系统的可靠性。然而,正是由于这种功能,才使远程控制 软件变得可怕起来,也使远程控制软件,病毒和黑客程序之间的区别变得越来 越模糊。 .1 远程控制与病毒的区别远程控制与病毒的区别 计算机病毒是能通过某种途径潜伏在计算机存储介质(或程序)里,当达 到某种条件时即被激活的具有对计算机资源进行破坏作用的一种程序或指令集 合。计算机病毒一般具有破坏性,隐蔽性,潜伏性,传染性等特点。从计算机 病毒的定义和特征中可以看出,远程控制软件与病毒的区别是十分明显的。最 基本的区别就在于病毒有很强的传染性,而远程控制软件没有。但是,如果远 程控制软件没有好的处理好软件的安全问题,就会跟病毒相差无几了。 .2 远程控制与黑客的区别远程控制与黑客的区别 “黑客”一词来源于英语单词 hack,本指“手法巧妙,技术高明的恶作剧” 。今天,在最新和最普遍的意思上说, “黑客”意味着那些偷偷地,未经许可就 第 4 页 共 26 页 进入别人计算机系统的计算机犯罪。他们或修改网页搞恶作剧或散布流言进行 恐吓,或破坏系统程度,施放病毒使系统险入瘫痪,或窃取政治,军事与商业 机密,或进行电子邮件骚扰,或转移资金帐户,窃取钱财,真所谓作案方式多 样,花样翻新,令人防不胜防。 由此可见,远程控制与黑客的区别是较大的。黑客往往利用操作系统和网 络的漏洞进行破坏活动,而远程控制软件的一大任务就是要保护控制端计算机, 使之不受非授权用户的访问。 当然,如果编写远程控制软件的唯一目的就是为了盗窃人家计算机上的隐 私,这样的远程控制软件就不再是有用的软件而是恶性的黑客程序了。 .3 远程控制与木马的区别远程控制与木马的区别 木马是一种在远程计算机之间建立起连接,使远程计算机能够通过网络控 制本地计算机的程序。它的运行遵循 tcp/ip 协议。由于它像间谍一样潜入用户 的电脑,为其他人的攻击打开后门,与战争的“木马”战术十分相识,因而得 名木马程序。 木马与远程控制软件的最大区别就是木马具有隐蔽性而远程控制软件没有。 3.3. 控制远程按键的背景技术介绍控制远程按键的背景技术介绍 3.1 winsocket 的介绍的介绍 .1 socketsocket 的基本概念的基本概念 实际上,socket 在计算机中提供了一个通信端口(套接口) 。通过这个端 口,一台计算机可以与任何一台具有 socket 接口的计算机通信。通信的基础是 套接口,一个套接口是通信的一端,在这一端上可以找到与其对应的一个名字。 一个正在被使用的套接口都有他的类型和与其相关的进程,套接口存在于通信 域中。一个套接口通常和同一个域中的套接口交换数据(数据交换也可以穿越 域的界限,但这时一定要执行某种解释程序) 。应用程序在网络上传输,接收的 信息都通过这个套接口来实现。在应用开发中就像使用文件句柄一样,可以对 socket 句柄进行读写操作。 .2 winsocketwinsocket windows socket(winsock)api 是基于 bsd 版本的套接字,但只为 windows 进行了专门的扩展。此外,winsock2.0 能支持许多网络协议,包括 tcp/ip,dec net 和 novell 的 ipx/spx 等。windows 套接字规范是一个由几家 开发商支持的接口规范。每个开发商都提供了他们自己的 dll 来和传输栈一起 工作。 第 5 页 共 26 页 3.23.2 客户端客户端/ /服务器(服务器(c/sc/s)模式)模式 在 tcp/ip 网络应用中,通信的两个进程间相互作用的主要模式是客户机/ 服务器模式(client/server) 。即客户向服务器发出服务请求,服务器接收到 请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建 立网络的起因是网络中软硬件资源,运算能力和信息不均等,需要共享,从而 造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用; 其次,网间进程通信完全是异步的,相互通信的进程见既不存在父子关系,又 不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者 的数据交换提供同步,这就是基于客户机/服务器模式的 tcp/ip。 4.4.控制远程按键程序的需求分析控制远程按键程序的需求分析 4.14.1 控制远程按键的需求分析控制远程按键的需求分析 本程序的主要作用是控制服务器端的按键。当客户端发生键盘按键事件时, 服务器端能够得到键码,实现按键的模拟。主要由以下几部分构成: (1) 实现使用 winsocket 建立客户端和服务器端连接。要想实现远程控 制,首先就要实现远程的互连。用 winsocket 将客户端和服务器端连接起来后, 服务器端才可以得到控制端的信息。 (2) 控制端发送键码。当客户端与服务器端连接好以后,客户端要想控 制服务器端的按键,必须要向服务器端发送与键盘按键对应的键码,服务器端 得到了这个键码后才可以做出按键的模拟。 (3) 实现服务器端模拟按键事件。服务器端在得到客户端传来的键码后, 根据键码做出正确的按键模拟,实现控制远程按键的功能。 第 6 页 共 26 页 4.2 控制远程按键的流程分析控制远程按键的流程分析 发送连接请求接受连接请求 等待控制命令 处理键盘事件 发送键码和 相关事件参数 接受键盘事件 命令和数据 模拟键盘事件 keybd_event 客客户户端端服服务务端端 图 1 控制远程按键流程分析图 5 5 远程按键控制的实现远程按键控制的实现 5.15.1 使用使用 winsocketwinsocket 建立控制端和被控制端连接建立控制端和被控制端连接 首先,客户端和服务器端都要创建一个数据套接字。接着,服务器调用 bind()函数给套接字分配一个公认的端口。这样,客户端和服务器端就使用同 样的端口来表示服务器套接字。一旦服务器将公认端口分配给了套接字,客户 端和服务器端就都能使用 sendto()和 recvfrom()来发送和接收数据报直到完成 传递。然后调用 close socket 来关闭套接字。 .1 初始化初始化 winsockwinsock .2 创建套接字创建套接字 .3 指定本地地址指定本地地址 .4 建立套接字连接建立套接字连接 建立套接字连接需要使用两个函数。即 connect()与 accept()。这两个函 数用于完成一个完整相关的建立,其中 connect()用于建立连接。无连接的套 接字进程也可以调用 connect(),但这时在进程之间没有实际的报文交换,调 用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目 的地址,而且如果收到一个数据报,其目的端口未与任何套接字建立“连接” , 便能判断该端口不可操作。accept()用于使服务器等待来自某客户进程的实际 连接。 connect()函数的原型声明如下: 第 7 页 共 26 页 int pascal far connect(socker s,const struct sockaddr far *name,int namelen); connect()函数共有 3 个参数,其中参数 s 指要建立连接的本地套接字句柄。 参数 name 指对方套接字地址结构的指针,对方套接字地址长度由参数 namelen 说明。 如果调用成功,connect()函数返回 0;否则,返回 socket_error。在面向 连接的协议中,该函数调用导致本地系统和外部系统之间连接的实际建立。 由于地址簇总被包含在套接字地址结构的前两个字节中,并通过 socket() 函数调用某个协议簇相关。因此 bind()和 connect()不需要协议作为参数。 accept()函数的原型声明如下: socket pascal far accept(socket s,struct sockaddr far* addr,int far*addrlen); 该函数也有 3 个参数,其中参数 s 为本地套接字句柄,在用做 accept()函 数调用的参数前应该先调用 listen()。 参数 addr 是指向客户方套接字地址结构的指针,用来接收连接实体的地址。 addr 的确切格式由套接字创建时建立的地址簇决定。 参数 addlen 为客户方套接字地址的长度(字节数) 。 如果调用成功,accept()函数返回一个 socket 类型的值,表示接收到的套 接字的句柄;否则,返回 invalid_socket。 accept()用于面向连接的服务。参数 addr 和 addrlen 存放客户方的地址信 息。调用前,参数 addr 指向一个初值为空的地址结构,而 addrlen 的初始值为 0;调用 accepet()函数后,服务器等待从编号为 s 的套接字上接受客户连接的 请求,而连接请求是由客户方的 connect()调用发出的。当有连接请求到达时, accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入 addr 和 addrlen,并创建一个与 s 有相同性质的新套接字号。新的套接字可用于处理 服务器并发请求。 socket(),bind(),connect(),accept()这 4 个套接字系统调用可以完成一 个完整五元通信(协议,本地主机地址和端口号,目的地址和端口号)相关的 建立。socket()指定五元组中的协议元,它的用法与是否为客户机或服务器, 是否面向连接无关。bind()指定五元中的本地二元,即本地主机地址和端口号, 其用法与是否面向连接有关;在服务器方无论是否面向连接,均要调用 bind();在 客户方,若采用面向连接,则可以不调用 bind(),而通过 connect()自动完成。 若采用无连接,客户方必须使用 bind ()以获得一个唯一的地址。 第 8 页 共 26 页 .5 监听连接监听连接 .6 关闭套接字关闭套接字 closesocket()关闭套接字 s,并释放分配给该套接字的资源;如果 s 涉及 一个打开的 tcp 连接。则该连接被释放。closesocket()函数的原型声明如下: bool pascal far closesocket(socker s); 该函数只有一个参数 s,它指待关闭的套接字句柄。 如果调用成功,closesoker()返回零;否则,返回 socket_error。 5.2 按键事件处理按键事件处理 .1 数据传输数据传输 当一个连接建立好以后,就可以传输数据了,常用的函数调用有 send()和 recv()。 send()调用用于在参数 s 指定的已连接的数据报或流套接字上发送输出数 据,其原型声明如下: int pascal far send(socket s,const char far *buf,int len,int flags); 该函数也有 4 个参数,其中参数 s 为已连接的套接字句柄。 参数 buf 指向接收输入数据缓冲区的指针,其长度由 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 用来向缓冲区填入收到的数据,而且仍按照数据的输入顺序进行填充。 对套接字来说,如果数据是按输入的队列接收过来的,recv()函数将返回 读入数据的字节数,否则,recv()将返回 socketerror。 .2 模拟按键模拟按键 函数 keybd_event()综合一个按键事件,系统用这个事件产生 wm_keyup 或 wm_keydown 消息.在 windowsnt 下,该函数被 sendinput()所代替.函数 keybd_event()的原型如下: void keybd_event(byte bvk,byte bscan,dword dwflags,dword dwextrainfo); 第 9 页 共 26 页 函数 keybd_event()有4个参数,其中参数 bvk 指所按键的虚拟键值.取值范 围在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.35.3 具体代码具体代码 由于篇幅有限,这里只列出了部分重要代码。 服务器端套接字的创建,绑定,连接:服务器端套接字的创建,绑定,连接: 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_inet; addr.sin_port = htons(m_uport); addr.sin_addr.s_addr = inaddr_any; nret = :bind(m_sckserver, (sockaddr*) if(nret != socket_error) 第 10 页 共 26 页 nret = :listen(m_sckserver, somaxconn); if(nret != socket_error) addrlen = sizeof(addr); trace(_t(“开始了服务,等待客户n“); m_sckclient0 = :accept(m_sckserver, (sockaddr*) if(m_sckclient0 != invalid_socket) /为了同步 :pl_sendsocketdata(m_sckclient0, null, 0, pl_temp, msg_oob); m_sckclient1 = :accept(m_sckserver, (sockaddr*) if(m_sckclient0 != invalid_socket 服务器端关闭套接字:服务器端关闭套接字: bool csocketthread: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); :waitforsingleobject(g_pwaitcommandthread-m_hthread, infinite); g_pwaitcommandthread = null; 第 11 页 共 26 页 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 = 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 = chdata0; 第 12 页 共 26 页 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_socket_maxbytes, null); if(nret != socket_error) / 处理命令 nret = doreceive(chdata, nret); else trace(_t(“接收数据错误,客户已经断开了n“); break ; delete chdata; chdata = null; exitserver(); 第 13 页 共 26 页 return exitinstance(); int csocketthread:doreceive(byte *chdata, int nlen) int nret = 0; switch(chdata0)/第一个字符为命令 case pl_peeper_ver:/取服务端版本 char chtemp15; zeromemory(chtemp, 15); sprintf(chtemp, “%s“, peeper_server_ver_15); :pl_sendsocketdata(m_sckclient0, (byte *)chtemp, strlen(chtemp), pl_peeper_ver); break ; case pl_close_peeper:/关闭服务,退出程序 exitserver(); exitthread(0); break ; case pl_client_close:/关闭连接 exitserver(); break ; case pl_msg:/显示一个对话框信息,使用了线程 g_strastring.format(_t(“%s“), chdata+1); if(g_pwaitcommandthread != null) :terminatethread(g_pwaitcommandthread-m_hthread, 0); 第 14 页 共 26 页 :waitforsingleobject(g_pwaitcommandthread-m_hthread, infinite); g_pwaitcommandthread = null; g_pwaitcommandthread = afxbeginthread(waitcommandthread, (lpvoid)pl_msg); break ; /以下是模拟按键。以下是模拟按键。 case pl_key_down:/一个键被按下 uint uchar = *(uint *)(chdata+1); uint uflag = *(uint *)(chdata+sizeof(uint)+1); :pl_keydown(uchar, uflag); :pl_sendsocketdata(m_sckclient0, null, 0, pl_temp); break ; case pl_key_up:/一个键被弹起 uint uchar = *(uint *)(chdata+1); uint uflag = *(uint *)(chdata+sizeof(uint)+1); :pl_keyup(uchar, uflag); :pl_sendsocketdata(m_sckclient0, null, 0, pl_temp); break ; 客户端端初始化套接字:客户端端初始化套接字: bool winapi pl_initsocket() #define major_version 1 #define minor_version 2 int nstatus = 0; word wmajorversion = major_version; word wminorversion = minor_version; 第 15 页 共 26 页 word wversionreqd = makeword(wmajorversion, wminorversion); wsadata lpmywsadata; nstatus = :wsastartup(wversionreqd, if(nstatus != 0) return false; 客户端连接服务器:客户端连接服务器: int nret = 0; sockaddr_in addr; hostent* pent = null; /套接字的创建。 m_ppeeperwnd-m_sckclient0 = :socket(af_inet, sock_stream, 0); m_ppeeperwnd-m_sckclient1 = :socket(af_inet, sock_stream, 0); trace(_t(“client socket 0 and 1:%d, %d.n“), m_ppeeperwnd-m_sckclient0, m_ppeeperwnd-m_sckclient1); if(m_ppeeperwnd-m_sckclient0 = invalid_socket | m_ppeeperwnd-m_sckclient1 = invalid_socket) bret = false; break ; /为套接字分配地址。 pent = :gethostbyname(m_ppeeperwnd-m_strip); if(!pent) bret = false; break ; addr.sin_family = af_inet; addr.sin_port = :htons(u_short)(m_ppeeperwnd-m_uport); addr.sin_addr.s_un.s_un_b.s_b1 = pent-h_addr_list00; addr.sin_addr.s_un.s_un_b.s_b2 = pent-h_addr_list01; 第 16 页 共 26 页 addr.sin_addr.s_un.s_un_b.s_b3 = pent-h_addr_list02; addr.sin_addr.s_un.s_un_b.s_b4 = pent-h_addr_list03; bret = false; / default for(int i = 0; i m_sckclient0, (sockaddr*) if(nret1 != socket_error) byte chdata5; zeromemory(chdata, 5); :pl_readsocketdata(m_ppeeperwnd-m_sckclient0, chdata, 5, null); else trace(_t(“socket error code = %d.n“), :wsagetlasterror(); trace(_t(“client0 is: %s.n“), (nret1 = 0)?_t(“ok“):_t(“failed.“); int nret2 = :connect(m_ppeeperwnd-m_sckclient1, (sockaddr*) if(nret2 = socket_error) trace(_t(“socket error code = %d.n“), :wsagetlasterror(); trace(_t(“client1 is: %s.n“), (nret2 = 0)?_t(“ok“):_t(“failed.“); if(nret1 = socket_error | nret2 = socket_error) sleep(2000); continue ; 第 17 页 共 2

温馨提示

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

评论

0/150

提交评论