《Visual C++实现对计算机远程监控》由会员分享,可在线阅读,更多相关《Visual C++实现对计算机远程监控(13页珍藏版)》请在金锄头文库上搜索。
1、Visal C+实现对计算机远程监控摘要:本文讲述了运用Soket套接字进行网络编程的一般技术,并通过该技术实现了对计算机的远程监控。 核心字:Scket套接字、服务器、客户端、远程监控 引言 在工程施工中常常遇到中心主控机房和工程现场相分离的状况,这就需要工程设计人员常常来回于中心机房与工程现场之间,有时甚至为了修改几种数据也要有关人员的现场操作才干解决。并且也不能较好的对工程现场进行实时的监测,这就为工程施工与系统的维护带来了极大的不便。目前局域网的技术已相称成熟,在中心机房和工程现场之间构建一种局域网也并不困难。因此我们可以在局域网的物理架构基本之上通过Skt套接字来实现计算机之间的通讯
2、,使维护人员能在中心机房内足不出户就可以实时地监测、控制远在工程现场的计算机的工作状态。本文就对类似程序的实现措施进行简朴的简介。St网络程序的一般思路Wiws Sckes 规范定义了一种基于 Microftidows的网络编程界面,它源于加里弗尼亚大学伯克利分校的伯克利软件发布(BSD)。它既涉及熟悉的伯克利 oket 风格的例程,也涉及了一组 indow特有的扩展,使程序员可以运用Wdos 原有的消息驱动机制进行网络方面的编程。而此类程序中最常用的一种模式就是客户服务器模式。在这种框架中,客户应用程序向服务器应用程序祈求服务。服务器应用程序一般在一种周知地址上侦听(listen)服务祈求。
3、就是说,直到一种客户向服务器发出联接祈求之前,服务器进程进程是休眠的。收到祈求时,服务器进程醒来(ake ),完毕客户祈求的相应的活动。 套接字共有三种类型:流式套接字,数据报套接字以及原始套接字等。流式套接字定义了一种可靠的面向连接的服务,实现了无差错无反复的顺序数据传播;数据报套接字定义了一种无连接的服务,数据通过互相独立的报文进行传播,是无序的,并且不保证可靠;原始套接字则容许对低层合同如I或IMP等合同进行直接访问,重要用于对新的网络合同实现的测试等。无连接服务器一般都是面向事务解决的,一种祈求一种应答就完毕了客户程序与服务程序之间的互相作用。而面向连接服务器解决的祈求往往比较复杂,不
4、是一来一去的祈求应答所能解决的,并且往往是并发服务器。 本文所采用的就是面向连接的套接字,其工作过程如下:服务器一方面启动,通过调用socket()建立一种套接字,然后调用ind()将该套接字和本地网络地址联系在一起,再调用liten()使套接字做好侦听的准备,并规定它的祈求队列的长度,之后就调用accep()来接受连接。客户在建立套接字后就可调用connec()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和wrt()来发送和接受数据。最后,待数据传送结束后,双方调用clse()关闭套接字。其重要的流程时序可以通过图1来表达:服务器端程序设计实现由于我们的目的是
5、通过在位于中心机房的客户端来监控远程的服务器端,而根据前面简介的面向连接套接字应用程序的工作方式,规定服务器必须先于客户端而运营。因此根据实际需要,我们应当让服务器程序能自启动。一般有三种措施:在Autoexec.b里添加代码;在Wi.ni的Run项里添加启动途径;在注册表里添加键值。本文在此采用后一种措施,通过向注册表的ofaMicrostWndwsurrentersonRun下添加键值的方式来实现,此外也可以在RnSrver下添加键值实现之:/设定待添加的注册表的途径LTS gspahSftwreMcrooftWdowsCrrentVersi ;/获取系统途径GetSysemDirecto
6、ry(ysPah,ie);GetMdeiNam(NLL,CurentPat,sze);/把服务程序从目前位置拷贝到系统目录中leurrnta = CrrentPh;FileNewNme strca(ysPath,Ste_eer.exe);ret =Cpyie(FieCuentam,FileNwName,TRUE);/打开键值r=egOpeneyEx(E_LCLACHINE,Rgpth,0,_RITE,hKEY);f(rt!=EROR_CCESS) eClse(hK); retn ALE;/设立键值ret=ReetValueEx(hKY,Syemer,NULL,type,(cost unsidh
7、r*)FilNewme,siz);if(ret!=RROR_UCCESS)eCloseKy(hKEY); rtur FLS;/关闭键值RegloseKey(hKE); 注册完之后就完毕了自启动。下面进行本文的重点:对套接字进行编程,一方面初始化Socket端口,并在初始化成功的前提下通过调用oce()创立一种套接字,然后调用bin()将该套接字和本地网络地址联系在一起,再调用lste()使套接字做好侦听的准备,并规定它的祈求队列的长度。其中lsten()函数重要用来建立一种ock套接字以侦听到来的联接,并且仅用于支持联接的oke,即类型为 KSTRA 的 sc。该套接字被设为被动模式,负责响应
8、到来的联接,并由进程将到来的联接排队挂起。该函数典型地用于需要同步有多种联接的服务器:如果一种联接祈求达到且队列已满,客户端将收到一种 WACONREFUSED 的错误。当没有可用的描述符时,listen() 将试图把函数合理地继续下去。它将接受联接直到队列为空。如果描述符变为可用,后来的对sten()或 acet()调用将会把队列填充到目前或近来的累积数(h urrent or ost ecentbaklg),也许的话,继续侦听到来的联接。下面是这部分的重要代码:waorVeron MAJO_VERSN;wMnrVeron = MNOR_VERON;wVeRd=MAKEWORD(wjorVe
9、sio,wMirersion);Staus WAStrp(werionReqd,&lpmyWSData); f (tatus != 0)rurnALE;/创立ocet套接字ServerSc = socke(AF_INET,OCK_TEAM,0);if (ServerSockIVLID_SOCKET)rturnFALSE;dtservr_adr.in_mily= F_INET;dserver_addr.sin_rt =hts(706);stserer_adr.si_addrs_addr = INADDR_ANY;/BINSatus =ind(ServeSo,(sruc sckddr fr )&d
10、stsever_dr,sizef(dservear);f (Stats!= 0)eturn FALSE;/LISTENStas = sten(ServerSoc,1);if (tatu!=)turn FALSE; 接下来需要调用accet()来接受连接。客户在建立套接字后就可调用onnect()和服务器建立连接。其函数原形为:SOKE P FAR accept ( SOT s, strut sockadr R* dr, nt FAR * adrlen );该例程从在 s上挂起的联接队列中取出第一种联接,用和s 相似的特性创立一种新的 sc并返回新 cke 的句柄。如果队列中没有挂起的联接,并且
11、socket 也未标明是非阻塞的,则 acp() 阻塞调用者直到有一种联接。已经接受联接的 ocket (acceptd ockt)不应用于接受更多的联接。参数adr 是一种返回参数,填入的是通信层的联接实体地址。地址参数dr 的严格格式由进行通信的地址族拟定。rlen 是一种返回参数值;该值在调用前涉及 dd 指向的缓冲区空间长度;调用返回时涉及返回地址的实际长度。 /ACCEPTn en = sizof(dsterr_dd);NewSoc ccept(evrock,(trusckadr f *)&dstsever_add,le);f (ewSoc 0) cossocket(ServerSo
12、ck);tun FALSE;/获取屏幕大小SWh= GetSytemMetics(CXCREEN);Syeight GeSystemMetrcs(SM_CYSEE); 连接一旦建立,客户机和服务器之间就可以通过调用r()和rite()来发送和接受数据。最后,待数据传送结束后,调用cl()关闭套接字。下面的函数就负责将目前的屏幕状态,以数据的形式通过snd函数发送给客户程序,以实现对远程服务器端的计算机的远程监视: /ed algFALG = S_FLAG;send(ewSck,(car*)&ALG,sizef(ALG)+,MSG_OB);/Gt Messengh =v(ewSock,(cr*)
13、&sg,siof(iMs)+,0);i (legth 0)/Clos Sock losescket(NewSock);lssocket(SverSock); eturn FASE;/GeMessageData (sg 500) send(wSock,(cha*)Syth,sf(SysWidh)1,MSG_OOB); s(NeSock,(a*)&SyHeiht,sieof(sHght)+,MSG_OOB);switch(iM) ceS_DEKTOPIT: /发送目前屏幕图像 SedDeto(); break; 其中,SeDestp()函数负责将屏幕保存成位图,然后再通过sed()函数将其以数据的形式发送出去,这一部分牵扯较多的位图操作,比较繁琐,由于本文重点并不在此,仅作为一种功能函数将其核心性代码摘选如下: id SendDektop() /创立桌面设备环境句柄 hdcmy =CreteDC(AY,NULL,UL,UL); hbuffec= CreteompatibleDC(hdcy); /创立位图 t=C