VC++实现对远程计算机屏幕的监视

日期:2016-08-07 16:41:46编辑作者:申博亚洲
 在实际工程中,经常有施工现场和控制中心不在一起的情况,在这种情况一般多由工程技术人员往返穿梭其间来实现对远程施工现场的情况了解和对控制中心的矫正控制。显然这种工作方式的效率是很低下的,没有充分发挥计算机网络的强大优势,其实通过网络编程完全可以使技术人员在控制中心对位于工程现场的远程计算机实施监视和控制。虽然互联网上有不少远程终端控制软件如"超级"、""等,但由于其带有的性质,不能保证其在编程时没有留有其他后门,因此从计算机安的角度出发应当自行开发此类软件。为避免本文所述技术被用于制造黑客类软件,本文将不准备对远程终端的控制部分做进一步的介绍,而将重点放在对远程计算机屏幕界面的监视上。 1 数据信息在网络上的传送

  由于本地计算机是通过网络来对远程计算机实施监控,因此需要对进行编程以实现往来于双方的数据信息在网络上的顺畅通讯。可供选择的方案有套接字、邮槽、命名管道等多种,本文在此选用开发和都比较灵活的流式套接字作为网络通讯的基础。考虑到实际情况,远程被监视主机随时为本地监控主机提供屏幕信息的服务,因此整个系统可以划分为两大模块--服务器端户机端,分别运行于远程主机和本地监控主机,由客户机向务器发出连接请求,在建立连接后由服务器定时发送远程屏幕信息给客户机,客户机接收到服务器发来的数据后将其显示在本地主机。

  至于用流式套接字对网络进行编程的主要过程可用下图来表示。服务器方在使用套接字之前,首先必须拥有一个Socket,可用socket()函数之:

sock=socket(AF_INET,SOCK_STREAM,0);


  其中AF_INET 和SOCK_STREAM指定了创建的是采用了TCP/IP地址族的流式套接字。该套接字实际上是提供了一个通信端口,通过这个端口可与任何一个具有套接字端口的计算机实施通信。一旦获取了新的套接字,应立即通过bind()将该套接字与本机上的一个端口建立关联。需要预先对一个指向包含有本机IP地址和端口信息的sockaddr_in结构填充一些必要的信息,如本地端口号和本地主机地址等,并通过bind()将服务器进程在网络识出来:

sockin_s.sin_family=AF_INET;
sockin_s.sin_addr.s_addr=0;
sockin_s.sin_port=htons(PORT);
bind(sock,(LPSOCKADDR)&sockin_s,sizeof(sockin_s));

  在完成接下来的listen()侦听后,需要用accept()等待接收客户端的连接,由于该函数在没有客户端进行申请连接之前会处于阻塞状态,因此需要为其单独开辟一个线程,以免影响到程序整体: 

AfxBeginThread(Server,NULL);//创建一个新的线程
……
UINT Server(LPVOID lpVoid)
{
 CSurveillant_ServerView* pView=((CSurveillant_ServerView*)((CFrameWnd*)
 AfxGetApp()->m_pMainWnd)->GetActiveView());
 int nLen=sizeof(SOCKADDR);
 pView->newskt_s= accept(pView->sock,(LPSOCKADDR)& pView->sockin_s,(LPINT)& nLen);
 WSAAsyncSelect(pView->newskt_s,pView->m_hWnd,WM_MSG,FD_CLOSE);
 pView->SetTimer(0,2500,NULL);
 return 1; 
}

  在这里通过WSAAsyncSelect()异步选择函数来以异步的形式响应关心的网络事件FD_CLOSE,并在该事件发生时发出自WM_MSG消息,通过响应这个消息可以得之当前与服务器联系的客户机程序已关闭退出,由于服务器部分是运行于远程工程现场的,为了使控制中心的监控程序(客户)在下次发出监控请求时能为其提供服务需要在WM_MSG的消息响应函数里关闭由accept() 所产生的新的套接字newskt_s,并重新启动该线程等待监控程序的再次连接。在accept()函数成功返回后,就可以在时器响应函数里用send() 函数与之建立了连接的监控主机定时发送捕获的远程屏幕信息了。

  作为客户的监控程序,其实现过程要比服务器许多。由于需要接收数据,因此在异步选择函数中需要设定待监测的网络事件为FD_CLOSE和FD_READ。在消息响应函数中可以通过对消息的低位字节进行判断而区分出具体发生是何种网络事件,并对其做出响应的反应。下面是监控端程序网络部分的主要代码:

……
IPaddr=inet_addr(strIP);
sock=socket(AF_INET,SOCK_STREAM,0); //创建套接字
sockin_c.sin_family=AF_INET;
sockin_c.sin_addr.S_un.S_addr=IPaddr;
sockin_c.sin_port=m_Port;
connect(sock,(LPSOCKADDR)&sockin_c,sizeof(sockin_c));//连接服务器
……
WSAAsyncSelect(sock,m_hWnd,WM_MSG,FD_READ|FD_CLOSE);
……

  通过异步选择函数的设定,在有数据到达时会由FD_READ触发WM_MSG消息,并在处理函数中通过recv ()将远程主机的屏幕信息从网络接收到缓存,并完成在本地机的重显。通过以上几步,已经初步具备了在远程服务器和本地客户机之间的网络通讯能力,可以完成屏幕信息的网络传送任务。

相关文章

VC++动态链接库编程之DLL典型实例

动态链接库DLL实现了库的共享,体现了代码重用的思想。我们可以把广泛的、具有共性的、能够多次被利用的函数和类定义在库中。这样,在再次 ..

发布日期:2016-08-07 详细>>

VC数据库编程分析

我们知道,在VB下进行基于ADO的编程相对比较简单,只要我们通过reference加载了适当的类型库以后,我们就可以正常的调用ADO对象,但是可能 ..

发布日期:2016-08-07 详细>>

http://www.jinyuankj.com/vc/20160807/41.html

VC实现串行通讯的三种途径

介绍了串行通讯的基本原理,以及在Win98,Win2000环境下实现串行通讯的三种方法,并给出了用Visual C++6 0编写的相应的应用程序。关键词: ..

发布日期:2016-08-07 详细>>

http://www.jinyuankj.com/vc/20160807/33.html

用VC++编程控制计算机和光驱

通常有些程序在初次使用使用时,要进行一些象安装特定字体的设置,之后需要重新启动计算机使之生效;而在一些多媒体软件编程中会用到用程序 ..

发布日期:2016-08-07 详细>>

申博亚洲:SQLITE3在VC/MFC中使用的一点体会

浙江大学生命科学与医学工程学系 徐晨勇 段会龙 吕维雪 摘 要 该文通过对CGI程序,特别是Windows CGI程序原理的分析,介绍了用Visual ..

发布日期:2016-08-07 详细>>