1、简析B公司局域网监控系统的设计摘 要在当今信息化高度发展的今天,局域网管理的重要性更加突出,建立一个强有力的局域网监控系统是很有必要的。局域网监控程序,应用于一般小规模的公司内部局域网,方便公司对员工的电脑进行监控管理,防止员工在工作时间利用公司电脑做与工作无关的事,从而提高工作效率。本局域网监控程序采用了Delphi 7开发,能显示局域网中所有活动主机IP,能对目标主机进行进程管理和连接监视,当发现目标主机异常时能发消息给目标主机予以提醒,可以控制目标主机的重启、注销、关机,并实行屏幕抓取,发现异常情况可锁定目标主机。关键词:局域网;Delphi;监控Design of Local Area
2、 Network Monitoring SoftwareAbstractWith the development of technology, local area network becomes more and more important. It is necessary to develop a local area network monitoring software. Local area network monitoring software is mainly applied in small scale company in local area network, whic
3、h helps company monitor and manage computer used by stuff and avoids stuff do things foreign to work.The local area network monitoring software is based on Delphi 7. It provides series functionalities , such as showing IP for all active host computers in the local area network, managing process and
4、monitoring connection for destination host, reminding exception by sending message to destination host when exception occurs, controlling operations of reset ,logging out and shutting down for destination host, printing screen, and locking destination host when exception occurs.Key words: local area
5、 network; Delphi ; monitoring目 录论文总页数:18页1 引言111 本课题研究的意义112 本课题的研究方法和思路12 相关软件和技术原理介绍121 Delphi基础介绍122 TCP简介223 INDY简介224 Socket简介33 系统设计与实现431 系统架构432 系统设计4321运行环境4322模块功能433 主要模块设计原理5331管理端界面设计5332通信模式设计思路6333通信原理7334通信流程7335 自定义控制协议标识符1034 主要功能的实现12341屏幕抓取的实现12342进程管理的实现14结 论15参考文献161 引言11 本课题研究
6、的意义计算机网络的普及应用已渗透到社会各个层面,给社会带来便利的同时也随之带来的安全和管理问题。互联网络是一把双刃剑;就如一个企业而言有些员工利用工作时间看新闻、玩游戏、干私活、聊天、泄密公司资料、炒股票、下电影、听歌曲、甚至在公司网上边拿老板工资边找工作等等。不仅仅消耗公司资源,更是因为影响公司效率、泄露公司机密、甚至丢失客户资源令人痛心。而利用局域网网络监控软件这非常有效的管理辅助手段并和企业的内部管理机制结合达到更加事半功倍的效果,已经成为大家的共识。12 本课题的研究方法和思路综合运用以前所学的网络相关知识,尤其是要掌握Object Pascal语言和网络编程,熟悉Delphi的常用控
7、件,先做好基本的界面框架,再实现每个模块的功能,界面与模块功能之间用创建事件联系起来(网络连接的监控/能对局域网资源进行搜索/显示局域网内所有活动主机的IP地址及主机名/发消息/控制目标主机的重启、注销、关机/实行屏幕抓取/锁定目标主机)调试成功后,最后再把各功能模块集成在一起。2 相关软件和技术原理介绍21 Delphi基础介绍Delphi是Borland公司研制的新一代可视化开发工具,可在Windows3.x、Windows95、WindowsNT等环境下使用。它拥有一个可视化的集成开发环境(IDE),采用面向对象的编程语言ObjectPascal和基于部件的开发结构框架。Delphi它提
8、供了100多个可供使用的构件,利用这些部件,开发人员可以快速地构造出应用系统。开发人员也可以根据自己的需要修改部件或用Delphi本身编写自己的部件。主要特点如下: (1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用它生成的执行文件更加精炼,运行速度更快。在处理速度和存取服务器方面,Delphi的性能远远高于其他同类产品。(2)支持将存取规则分别交给客户机或服务器处理的两种方案,而且允许开发人员建立一个简单的部件或部件集合,封装起所有的规则,并独立于服务器和客户机,所有的数据转移通过这些部件来完成。这样,大大减少了对服务器的请求和网络上的数据传输
9、量,提高了应用处理的速度。 (3)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。 (4)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。 (5)具有强大的数据存取功能。它的数据处理工具BDE(BorlandDatabaseEngine)是一个标准的中介软件层,可以用来处理当前流行的数据格式,如xBase、Paradox等,也可以通过BDE的SQLLin
10、k直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。 Delphi既可用于开发系统软件,也适合于应用软件的开发。22 TCP简介TCP(Transmission Control Protocol,传输控制协议)是一个面向连接的协议,它依赖于IP 协议。TCP 在两台通信的计算机之间建立一个虚拟的连接,数据可以进行可靠无误的双向交换。在TCP 协议中,两台计算机在通信前先要建立Socket(套接字,即通信端点),每个套接字由本机的IP 地址和一个16 位的端口号组成,建立连接后,数据都被拆分成小于64k 字节的片断,加上数据包头发送出去,到达另一台主机后再重
11、新组装。当不再需要连接时,必须释放和撤销连接,为下一次传输腾空资源。TCP 为确保数据在传输过程中的可靠性,除规定了数据包的格式外,还具体规定了端对端连接管理的规则,传输数据是策略的约定、拥挤与阻塞控制的规则和定时时间量管理办法等。这样IP 协议束手无策的诸多问题都得到了解决,如数据包失效问题,当TCP 发现数据包已经过时,则会要求发送端重新发送;数据接收次序问题,在实际中数据包有可能不能按照原来的先后次序到达,而TCP 并不要求接收和发送的次序一致,仍能按照正确的顺序装配好。23 INDY简介INDY的全名是Internet Direct(也叫Winshoes),它是一套开放源代码的Inte
12、rnet控件集,它支持大部分流行的Internet协议,包括TCP、UDP、DNS、ICMP、FINGER、FTP、GOPHER、HTTP、POP3、SMTP、TELNET、WHOIS等,支持BASE64、MD2、MD4、MD5等编解码,提供INTERNET流行协议的客户端和服务器控件。INDY控件集的客户端和服务器控件都有完整、详细的源代码例程和帮助文件,用户可以根据这些例子,简单方便快速的建造各种服务器程序,例如WEB服务器、TELNET服务器、IRC服务器、TCP、UDP服务器等,而这些服务器都是支持多线程的。用户也可以很简单的编写出各种客户端程序,例如EMAIL、FINGER、FTP、
13、PING、TELNET等。INDY是完全基于SOCKET阻塞工作模式的开发库,这是区别于winsock的一大特点,winsock使用的是异步模式(非阻塞模式)阻塞模式具有以下几个比异步模式优越的特点:编程更简单,可以把所有处理SOCKET的代码放在一起,顺序执行,而不用分散在不同的事件处理代码段里。更容易在多线程程序里使用,由于阻塞模式的代码可以放在一起,可以很方便的把这些代码包裹在线程里面来使用,而不象异步模式,需要针对不同的事件,设置不同的处理代码。24 Socket简介Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出,它定义
14、两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。对于应用程序来说,它就像一个服务协议插座一样,各种不同的协议,对应不同的端口。我们可以把套接字看作相应进程上的“门”:进程把消息发送到网络或从网络接受消息都得经过自身得套接字。当一个进程想给另一台主机中的另一个进程发送消息
15、是,它就把该消息推出自家的门。该进程认定在这扇门的另一侧有一个传输设施会把这个消息传输到目的进程的门口。在服务器进程处于运行状态的情况下,客户进程就能够初始化一个到服务器的TCP连接了,这是通过在客户程序中创建一个套接字对象来完成的,当客户创建了它的套接字对象的时候,它详细说明了服务器进程的地址,也就是,服务器的IP地址和进程的端口号,一旦创建了套接字对象,客户端的TCP就发起一个三次握手,并建立一个和服务器的TCP连接,三次握手对客户和服务器程序来说是完全透明的。3 系统设计与实现31 系统架构局域网监控程序是一个C/S模式的软件,客户端(被监视电脑)运行server.exe后主动连接管理端
16、(服务器),管理端响应连接通过一台主机对多个客户端进行监控操作。客户端2客户端3客户端4 管理端 客户端1图1 监控程序构架图32 系统设计321运行环境硬件系统:1.CPU P4 2.42.内存 512M3.普通网卡操作系统:Windows XP 软件需求:Dehphi 7322模块功能在管理端有13个操作模块分别为允许关机,禁止关机,关机,重启,注销,锁屏,解锁,发送消息,查看屏幕,文件管理,进程管理,连接监视和退出程序。管理端发送消息允许禁止关机重启注毁锁定解锁文件管理查看屏幕连接监视进程管理图2 管理端模块功能33 主要模块设计原理331管理端界面设计332通信模式设计思路333通信原
17、理本设计实现的是一台主机对局域网内的多台主机,采用了INDY的多线程技术,下图显示了idTCPServer的工作原理。INDY服务器组件idTCPServer创建一个同应用程序主线程分离的监听线程来监听被监视电脑连接请求,对于接受的每一个被监视电脑,都创建一个新的线程来为该被监视提供服务,所有与这一被监视电脑相关的事务都由该线程来处理。主线程idTCPserver.Active:= True;idTCPserver.Active:= False;监听线程被监视电脑1连接请求被监视电脑2连接请求被监视电脑n连接请求被监视1线程被监视2线程被监视3线程图4 idTCPServer的工作原理334通
18、信流程因为INDY组件是基于SOCKET阻塞工作模式,阻塞套接字调用在完成工作之后才返回,如果在程序主线程中进行此类调用,应用程序将不能正常处理用户界面消息,从而造成了用户界面的“死锁”。而在管理端和客户端添加一个TidAntiFreeze组件就可以避免用户界面“死锁”的发生,TIdAntiFreeze在INDY内部定时中断对栈的调用,并在中断期间调用Application.ProcessMessages方法处理消息,而外部的INDY调用继续保存阻塞状态,就好像TIdAntiFreeze对象不存在一样。这样界面“死锁”的问题就可以得到完满的解决。在客户端添加idTCPClient组件,在管理端
19、添加idTCPServer组件,这样它们之间就形成了TCP通信,客户端是在被监视电脑上运行,管理端是在主机上运行面向操作员,具体客户端和管理端之间的通信如下图:否是客户端获取IP和端口请求连接是否连接成功管理端退出否是图5 通信流程图客户端从Config.ini获取管理端的IP地址和开放端口(8080),客户端得知IP和端口后便主动向管理端发送连接请求,管理端接受请求与客户端建立连接,管理端想对客户端实施监控操作时,便发送操作指令给客户端,客户端接受指令并在内部解析,客户端得出结果并返回给管理端,管理端在界面上显示出返回的操作结果。要建立与服务器的连接,应首先要知道服务器的IP地址和开放通信端
20、口,在1024以下的端口号中,很多都已经分配出去了,如FTP的端口为20和21,SMTP的端口是25,WEB服务器的端口为80等,为防止无意间的冲突,选择了8080为客户端的开放通信端口。在客户端有个Config.ini的服务器配置文件,在文件里输入服务器的主机IP以及服务器开放的通信端口8080,这样就指定好了服务器的IP和端口begin filepath := ExtractFilePath(Application.ExeName); inifile := TIniFile.Create(filepath + Config.ini); IP_str := inifile.ReadStrin
21、g(服务器设置,服务器地址,127.0.0.1); post_int := inifile.ReadInteger(服务器设置,端口,8080);Gjtime := 1; Servername:=IP_str;end;运行客户端通过config.ini得知管理端的IP和通信端口后便主动向管理端发送连接请求,要实现主动连接管理端这里用到了一个Timer控件,在客户端上添加一个Timer控件,把控件的interval属性设置为10000,也就是每隔10000毫秒向管理端发送一次连接请求。以下代码便是利用Timer控件主动连接管理端的判断语句,如果建立连接,就向管理端发送被监视电脑的计算机名称、IP
22、地址和操作系统类型。procedure TServerForm.Timer1Timer(Sender: TObject);begin try if not IdTCPClient1.Connected then begin if ConRpcport(IdTCPClient1) then begin if not IdTCPClient1.Connected then exit; SendStreamToClient(IdTCPClient1,000,ComputerName+#13+GetOSName(GetOSVersion); ClientHandleThread:=TClientHan
23、dleThread.Create; end; end; except end;end;当客户端发送连接请求时,管理端在线便可以接收到客户端的请求,并与客户端建立连接,同时在界面通过ListView控件显示客户端的电脑名称、IP地址、操作系统。StatusBar控件显示已成功启动和在线主机有几台begin count:=0; MyFirstBmp:=TMemoryStream.Create; IdTCPServer1.DefaultPort:=8080 ; /服务器端口 IdTCPServer1.Active:=true; if IdTCPServer1.Active then StatusBa
24、r1.Panels.Items0.Text:=已成功启动; StatusBar1.Panels.Items1.Text:=在线主机0台;end;判断在线主机有几台:procedure TMainForm.ListView1Change(Sender: TObject; Item: TListItem; Change: TItemChange);beginStatusBar1.Panels.Items1.Text:=在线主机+inttostr(ListView1.Items.Count)+台;end;335 自定义控制协议标识符客户端和管理端建立连接以后,客户端通过管理端操作界面上的每个功能按钮
25、来对被监视电脑进行操作,这里要说明的是在这个程序里管理端向客户端发送的操作指令是自定义的控制协议标识符,用010、012等阿拉伯数字来表示,这些自定义标识符的作用就是管理端和客户端之间的协议,管理端通过发送这些标识符来告诉客户端该做什么。管理端通过自定义函数ZhuDongCmdSend向客户端发送标识符,例如:procedure TMainForm.SpeedButton4Click(Sender: TObject);beginZhuDongCmdSend(093, , false); end;其中093就代表的是关机标识符客户端收到093这个指令后在自己协议列表里寻找093这个指令的意思并进
26、行操作:if RDStrList0 = 093 then /关机 begin SOkz(1); exit; end;当找到093为关机指令时,调用Sokz函数进行关机操作。下面是对部分重要的自定义控制协议标识符进行说明:文件管理:010:删除文件或文件夹011:新建文件012:接收客户端传来的文件013:发送文件到客户端014:远程运行文件进程管理:020:刷新进程021:结束进程连接监视:030:刷新窗口031:显示窗口032:隐藏窗口033:关闭窗口查看屏幕:050:屏幕截取090:禁止关机091:允许关机093:关机094:注消095:发送消息34 主要功能的实现341屏幕抓取的实现当管
27、理端与客户端建立连接时,如果客户端收到抓屏指令(050),客户端调用API函数GetWindowDC获取被监视电脑整个窗口的设备场景,再利用自定义函数My_GetScreenToBmp实现屏幕抓取。截取图片为BMP格式,把BMP写入内存流中,然后把流发送给管理端。管理端接收到流后做相反操作,将流转BMP然后用ShowImageForm显示出来。抓图代码:Procedure My_GetScreenToBmp(DrawCur:Boolean;StreamName:TMemoryStream);/自定义抓屏函数,DrawCur 表示抓鼠标图像与否varMybmp:Tbitmap;Cursorx,
28、Cursory: integer;dc: hdc;Mycan: Tcanvas;R: TRect;DrawPos: TPoint;MyCursor: TIcon;hld: hwnd;Threadld: dword;mp: tpoint;pIconInfo: TIconInfo;beginMybmp := Tbitmap.Create; 建立BMPMAP Mycan := TCanvas.Create; 屏幕截取dc := GetWindowDC(0); /得到一个句柄tryMycan.Handle := dc;R:=Rect(0,0, Screen.Width,Screen.HeightGet
29、SystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN); /样式设置Mybmp.Width := R.Right;Mybmp.Height := R.Bottom;Mybmp.Canvas.CopyRect(R, Mycan, R); /COPY 结构finallyreleaseDC(0, DC);end;Mycan.Handle := 0;Mycan.Free;if DrawCur then 画上鼠标图象beginGetCursorPos(DrawPos);MyCursor := TIcon.Create; /创建一个对象getcu
30、rsorpos(mp);hld := WindowFromPoint(mp);Threadld := GetWindowThreadProcessId(hld, nil);AttachThreadInput(GetCurrentThreadId, Threadld, True);MyCursor.Handle := Getcursor();AttachThreadInput(GetCurrentThreadId, threadld, False);GetIconInfo(Mycursor.Handle, pIconInfo);cursorx := DrawPos.x - round(pIcon
31、Info.xHotspot); /得到坐标cursory := DrawPos.y - round(pIconInfo.yHotspot); Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); 画上鼠标DeleteObject(pIconInfo.hbmColor);GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象DeleteObject(pIconInfo.hbmMask);否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽Mycursor.ReleaseHandle; 释放数组内存MyCur
32、sor.Free; 释放鼠标指针end;Mybmp.PixelFormat:=pf8bit; /256色/Mybmp.SaveToFile(Filename); /保存对象Mybmp.SaveToStream(StreamName);Mybmp.Free;end;342进程管理的实现通过Createtoolhelp32snapshot(Th32cs_snapprocess,0) )函数获取系统运行进程列表 ,再通过Process32First和Process32Next对系统中的所有进程进行枚举,并保存其信息 。新建一个ProcessForm框体,设定框体的PopupMenu属性为PopupM
33、enu1以便下面能进行添加PopupMenu1组件的操作。在框体上添加ListView组件,在ListView设定5个列,Caption分别为进程名、进程ID、线程数、优先级和父进程ID,再在框体上添加一个PopupMenu1组件(右键弹出菜单),设置TpopupMenu1的AutoPopup属性为true表示通过TPopupMenu的Popup方法来呼出菜单,添加“结束进程”和“刷新”为 PopupMenu1右键下拉菜单的2个功能。结束进程和刷新分别对应的自定义控制协议标识为021和020,管理端通过向客户端发送这2个指令来实现对进程的刷新和结束。var isOK:Boolean; Proc
34、essHandle:Thandle; ProcessStruct:TProcessEntry32; TheList:Tstringlist; i:integer;begin TheList:=Tstringlist.Create; /建一个线型表 ProcessHandle:=createtoolhelp32snapshot(Th32cs_snapprocess,0); processStruct.dwSize:=sizeof(ProcessStruct); isOK:=process32first(ProcessHandle,ProcessStruct); for i:=0 to 100 d
35、o ThreadIDi:=0; ThreadID0:=ProcessStruct.th32ProcessID; i:=0; while isOK do begin TheList.Add(ProcessStruct.szExeFile);/进程名 if true then / isNt begin TheList.Add(IntToStr(ProcessStruct.th32ProcessID);/进程ID TheList.Add(IntToStr(ProcessStThreads);/线程数 TheList.Add(IntToStr(ProcessStruct.pcPriClassBase)
36、;/优先级 TheList.Add(IntToStr(ProcessStruct.th32ParentProcessID);/父进程ID end else begin TheList.Add(IntTostr(ProcessStruct.th32ProcessID);/进程ID TheList.Add(0);/线程数 TheList.Add(0);/优先级 TheList.Add(0);/父进程ID end; isOK:=process32next(ProcessHandle,ProcessStruct); inc(i); ThreadIDi:=ProcessStruct.th32Proces
37、sID; end; Result:=TheList.text; CloseHandle(ProcessHandle);TheList.Free;结 论本设计是我结合在学校学习的局域网知识和网络编程基础通过Delphi 7的开发环境完成的。它是一个基于C/S结构的局域网监控程序,主要用于小型局域网对多台主机的监控管理,监控程序能显示局域网中所有活动主机IP,能对目标主机进行进程管理和连接监视,当发现目标主机异常时能发消息给目标主机予以提醒,可以控制目标主机的重启、注销、关机,并实行屏幕抓取,发现异常情况可锁定目标主机。监控程序基本满足了用户对系统的需求,并且提供的服务功能与用户的实际工作情况结合
38、,符合用户的工作思维及习惯。监控程序性能运行稳定,界面友好、便于操作,甚至没有计算机基础的用户也能很好的使用。由于系统提供的界面一目了然,对于局域网管理人员来说能很轻松的完成对局域网内多台计算机的监控,提高了工作效率,减轻了对人工操作的需求。由于自身能力有限,设计也有许多不足,由于客户端一启动就不断的向管理端发送连接请求,从而导致了运行了客户端的被监视电脑的内存使用过大,运行速度变慢,还有就是对多个用户的支持不足,一旦运行客户端的被监视电脑过多,管理端就变得非常缓慢,严重的就会导致死机。在以后的设计开发中我会尽量考虑周全的。通过毕业设计的开发,我学到了许多关于网络通信的知识,更主要的是锻炼了自己独立思考的和解决问题的能力,使我受益匪浅。参考文献1 王沛.Delphi7编程入门M.北京:机械工业出版社,2006 2 Marco Cantu.Delphi7从入门到精通M.北京:电子工业出版社,20033 刘艺.Delphi面向对象编程M.北京:清华大学出版社,2004 4 黄超,罗宏宇.Delphi网络应用开发技术与实例M.北京:清华大学出版社,20055 甘志,李幼仪.DELPHI7高级应用开发篇M.北京:清华大学出版社,2006
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100