基于MFC的远程监控系统的技术分析
2013-03-23李庆江
李庆江
(菏泽学院教务处,山东 菏泽 274000)
1.引言
远程监控程序利用了套接字和应用程序的消息机制,让控制客户端与被控服务端进行数据交换,从而达到监控与被监控的目的。根据这个思想,本远程监控系统需要两个独立的程序,客户端程序和服务器程序,即对应为主控端和被控端。使用前需要将客户端程序安装到主控端电脑上,将服务器程序安装到被控电脑上。
2.Windows系统编程
Windows Socket(WinSock)API是基于BSD版本的套接字,但为Windows进行了专门的扩展。WinSock API中使用的大多数函数与UNIX中的Berkeley Socket实现是一样的。而Windows程序是一种基于事件驱动的编程模式,这就意味着应用程序所要做的大部分工作都是随着Windows消息的变化而进行的。在远程控制软件中将涉及大量的系统消息处理和自定义消息的处理。
3.客户端模块划分
根据远程控制程序的功能要求,客户端需要完成六个功能模块:主框架模块、搜寻服务器模块、屏幕监控模块、文件传输模块、文件监控模块。
以下对各模块进行简单介绍:
主框架模块:负责客户端窗口消息处理和映射。提供菜单和分区视图,显示功能模块的按钮选项。
搜寻服务器模块:主要是输入搜寻范围,即IP地址范围。搜寻到局域网络中已开机并安装了服务器程序的主机,与之连接并通过远程的服务器端程序查看被控端机器的基本信息。
屏幕监控模块:用于实时监视被控端电脑的屏幕显示。
文件传输模块:用于接收和发送各种鼠标、键盘消息等命令,实现文件与文件夹的上传与下载。
文件监控模块:用于实现两端机器问文件及文件夹的管理,主要包括删除文件、目录浏览、文件更名、更改文件属性等。
由于远程控制程序的相关技术涉及的面比较多,这里主要介绍文件传输技术设计。
4.远程文件的管理
在远程控制中,远程文件的管理主要包括文件的上传(即把文件从被控制端传到控制端)与下载(即把文件从控制端下载到被控制端)、文件删除、浏览目录、修改文件的相关信息如文件名、文件的读写属性等。这些功能基本上可用文件传输协议FTP来实现。
在VC++6.0开发环境下,要进行FTP的相关文件操作,需要用到两个类:CInternetSession和CFtpConnection。如果在程序运行期间需要保持和服务器的连接,可以创建一个CInternetSession的对象作为类CWinApp的成员。
FTP是MFC的WinInet支持的三个Internet功能之一,这里只需要先创建一个CInternetSession实例和一个CFtpConnection对象,就可以实现和一个FTP服务器的通信。
头文件定义如下:
{CFtpConnection*m_pFtpConnection;Cstringm_FileEdit;}
上传文件代码实现如下:
void CFtpDlg::OnSend()//这里表示创建了一个基于对话框的应用程序
{UpdateData();m_FileEdit.Trim Left();m_FileEdit.TrimRight();
if(m_pFtpConnection)
{if (!m_pFtpConnection->PutFile(m_pFileEdit,m_FileEdit))
{MessageBox(“上传文件失败!”);}else{MessageBox(“上传文件成功。”);}}else{…}}
5.服务器主要应用技术
为满足多客户端的实现,需要采用多线程技术的支持。在本软件服务器端会对每个客户端创建一个监听线程,并针对每个监听线程实例化一个CServer类提供其数据及服务。另一个主要技术是程序的自启动和隐藏技术。
5.1 多线程技术
以下是多线程实现多客户端的核心代码。while(TRUE)
{ Accept=accept(Listen,(struct scokaddr*)&client,&iAddrSize);
if(Accept!=INVALID_SCOKET)
{Clientinfo.socket=Accept;
memset(szClientIP,’ ’,sizeof(szClientIP));
sprintf(szClientIP,”%s”,inet_ntoa(client.sin_addr)
);
CreateTread(NULL,0,ClientThread, (LPVOID)&clientinfo,&dwThread);
if(thread){CloseHandle(thread);}}}
5.2 程序的自启动与隐藏技术
服务器端应用程序在机器开启后将自动启动并隐藏,然后它需要拥有一个套接字,系统调用socket()函数建立套接字,当一个套接字创建后,用bind()函数将套接字地址与所创建的套接字编号联系起来,即将名字赋予套接字。接下来它会调用listen()函数进行线路监听,当发现网络上有客户端程序要求连接时,就调用accept()函数与其连接。可以利用win.ini文件实现相关程序的自动启动及利用注册表实现相关程序的自动启动。
[1]张友生.远程控制编程技术[M].2版.北京:电子工业出版社,2006.160-200.
[2]谢希仁. 计算机网络 (第五版)[M]. 北京:电子工业出版社,2008.50-130.
[3]P aul S.W ang.标准C++与面向对象程序设计(第2版)[M].北京:机械工业出版社,2003.25-120.
[4]孤舟.远程桌面实现远程控制[J].个人电脑,2006,12(5):24-26.