网络监控系统的研究与设计
2011-04-12马蓉晖冯素琴
马蓉晖,冯素琴
(忻州师范学院计算机科学与技术系,山西忻州034000)
大多数的监控管理软件缺乏实时性和直观性,监控管理力度有限。为解决这些问题,引入远程屏幕截取技术。该技术截取客户机的屏幕图像到服务器端[1]。主要包括连接模块、截取模块、传送模块和控制模块。其中连接模块、截取模块和传送模块实现了远程屏幕截取功能;控制模块实现了远程关机、远程重启、光驱控制和鼠标控制等功能。
1 连接模块设计
远程屏幕功能分为:监控端和被监控端。对于局域网而言,每个客户机的IP地址可以是静态的,也可以是动态分配的。通过计算机名称进行连接,即可解决问题[2]。为保证图像信息的准确性,采用TCP协议。为了避免造成网络拥塞,采用一对一连接。两端各有一个Winsock控件。其中被监控端的Winsock控件应处于listen状态;监控端等待输入对方IP地址或计算机名称后,用connect方法与被监控端建立连接[3]。注意:两端的端口号应一致,否则不能建立连接。
被监控端:文本框控件用于显示本地IP地址和计算机名称。标签控件的标题分别为本地机器地址和本地机器名称。被监控端的主要代码如下。
Me.tcpclient.LocalPort=2000 ‘设置监听端口号Me.tcpclient.Listen‘开始监听
Me.Text2.Text=Me.tcpclient.LocalIP ‘获取 IP Me.Text3.Text=Me.tcpclient.LocalHostName Winsock 控 件 的 tcpclient_ConnectionRequest代码:
Private Sub tcpclient_ConnectionRequest(ByVal requestID As Long)
If Me.tcpclient.State <> sckClosed‘接受新连接
Then tcpclient.Close
tcpclient.Accept requestID
监控端的主要代码如下。
Me.Text3.Text=""‘获取相关文本框的值
Me.Text1.Text=Me.Winsock1.LocalHostName
Me.Text2.Text=Me.Winsock1.LocalIP
Me.StatusBar1.Style = sbrSimple‘设置状态栏
Me.StatusBar1.SimpleText= "准备建立连接"
If Me.Text3.Text= ""Then
MsgBox"请输入对方ip或计算机名称!",vbOKOnly,"提示信息"
Exit Sub
End If
Me.Winsock1.RemoteHost=Me.Text1.Text‘设置IP地址或计算机名称
Me.Winsock1.RemotePort=2000 ‘远程端口号
Me.Winsock1.Connect‘进行连接
Me.StatusBar1.SimpleText="建立连接中……"
2 截取模块设计
被监控端通过调用API函数来实现屏幕图像的截取,并保存到硬盘上便于传送时读取该文件[4]。接收到监控端的截取命令后,调用API函数截取并保存即可。
被监控端:在连接模块的工程内,添加一个标准模块,用于声明相关的API函数和定义相关的函数。被监控端的主要代码如下。
If Client Then
hDCSrc=GetDC(hWndSrc)Else
hDCSrc=GetWindowDC(hWndSrc)
End If
hDCMemory=CreateCompatibleDC(hDCSrc)
hBmp=CreateCompatibleBitmap(hDCSrc,Width-Src,HeightSrc)
hBmpPrev=SelectObject(hDCMemory,hBmp)‘获得屏幕属性
……
r=DeleteDC(hDCMemory)
r=ReleaseDC(hWndSrc,hDCSrc)'释放资源
Set CaptureWindow=CreateBitmapPicture(hBmp,hPal)
Winsock控件的tcpclient_DataArrival事件代码如下:
Private Sub tcpclient_DataArrival(ByVal bytesTotal As Long)
tcpclient.GetData a
Select Case a
Case"entire"
Set Picture1.Picture=CaptureScreen()
SavePicture Picture1.Picture,"d:ww.bmp"
Case"active"
Set Picture1.Picture=CaptureActiveWindow()
SavePicture Picture1.Picture,"d:ww.bmp"
End Select
End Sub
监控端的主要代码如下。
Me.Winsock1.SendData"entire"‘发送指令以截图
Me.Winsock1.SendData"active"
3 传送模块
传送模块只要在前两个模块的基础上,将被监控机的图像传送到监控机即可。图像文件读取使用Visual Basic中的文件读取命令;传送调用Winsock的senddata方法,接收调用getdata方法[6]。当传送完毕,即可加载图像。为防止接收图像占用大量硬盘空间,加载后需要删除该图像。代码略。
4 控制模块
控制模块主要包括:光驱控制、鼠标控制、计算机控制。光驱控制包括:弹出光驱、弹入光驱[5]。鼠标控制包括:交换鼠标左右键、隐藏鼠标。计算机控制包括:注销计算机、重启计算机、关闭计算机。一般来说隐藏鼠标指针有两种方法。一种是用一个透明图标代替鼠标指针,并将MousePointer属性设为99。另一种是用API函数来隐藏指针。其余工作通过调用相关的API函数实现。这里仅介绍光驱控制。
被监控端:连接模块的工程中,添加一个标准模块。被监控端主要代码如下。
标准模块内的主要代码如下:
Public Sub CDDoor(bOpen As Boolean)
Dim dump
Dim returnstring As String
If(SendMCIString("open cdaudio alias cd wait shareable")=False)Then
Exit Sub
End If
SendMCIString"set cd time format tmsf wait"
If bOpen Then‘打开光驱
SendMCIString"set cd door open"
Else ‘关闭光驱
SendMCIString"set cd door closed"
End If
End Sub
监控端:在窗体内添加两个按钮,分别用于控制弹出、弹入光驱。
两个命令按钮的代码分别如下:
Me.Winsock1.SendData"opencd"
Me.Winsock1.SendData"closecd"
5 结语
虽然完成了服务器对客户机的屏幕截取功能,但是还有一些问题尚待解决。比如:屏幕图像的压缩和解压缩问题,网络拥塞问题以及判断光驱状态问题等等。屏幕图像压缩后,便于快速的传送。解决了网络拥塞,便于建立一对多连接。一对多的TCP连接可以通过动态加载Winsock控件数组实现。这些问题有待以后进一步完善。
[1]王锐等.网络最高安全技术指南[M].北京:机械工业出版社,1998.
[2]张光勇.校园网IP地址管理系统的设计与实现[J].科技创新导报,2007(32):1-2.
[3]王达.网管员必读——网络安全[M].北京:电子工业出版社,2007.
[4]陈文云,巩丹宏.网络通信软件设计原理及应用[M].西安:西安交通大学出版社,2000.
[5]王宇,张宁.网络监听原理分析与实现[J].计算机应用研究,2003,38(7):142-145.
[6]龚沛曾,陆尉民,杨志强.Visual Basic程序设计教程(6.0)[M].北京:高等教育出版社,2000.