网络程序设计报告_第1页
网络程序设计报告_第2页
网络程序设计报告_第3页
网络程序设计报告_第4页
网络程序设计报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 课题描述1.任务内容基于windows的远程控制软件开发毕业设计的主要任务是要求做出从系统角度设计的远程控制模式,并制作相应实用软件。采用服务器(server),客户端(client)模式,使用socket编程的基本原理及windows的消息系统。实现基本的远程控制要求,界面新颖友好。用vc开发!要求: 1)远程控制模式架构,如基于主从模式; 2)远程控制功能实现,如开关机,远程监视; 3)远程控制安全考虑; 4)远程控制实现平台与技巧; 5)远程控制软件实现,要求至少能在两台电脑上正常运行; 6)界面新颖友好。2. 应完成内容1),查看被控制端的文件目录清单;2),查看被控制端的文件内

2、容;3),拷贝被控制端的文件到控制端;4),强迫被控制端重新启动或关机;5),修改被控制端的系统配置文件;6),直接执行任何可执行命令,打开应用程序;7),锁住(解锁)被控制端的屏幕,键盘和鼠标;8),控制被控制端的屏幕,在本地直接操作被控制端计算机;9),隐藏共享被控制端的硬盘;10),同时可以做到被控端的服务器自动运行及隐藏等功能;11),补充:做不好的话,会带来严重的安全隐患。会给一些居心不良的人留下后面。所以要同时做好相关的安全性考虑。二、 系统分析1. 系统功能分析本程序是由客户端和服务器端两部分组成的。而且需要客户端和服务器端同时运行相应的程序来实现的。本软件要实现的基本功能可以简

3、化如下: 第一步,服务器端运行相应的远程控制软件服务器程序,使服务器端的某个端口处于监听状态(本软件端口设置为4069)。这样服务器端计算机就时刻处于监听远程计算机连接请求的状态。 第二步,当服务器端程序运行后,客户端在本地计算机中运行相应程序的客户端程序,运行这个客户端程序时,会指定一个要连接的服务器的ip地址和端口,(本软件初始化的服务器地址是,端口:4069),程序运行后,点击连接就会向所有的网络搜索指定的计算机了。 第三步,搜索到所指定的计算机后,客户端计算机就向服务器端指定的端口发送连接请求(本软件使用tcp连接),如果服务器端计算机同一端口处于监听状态,则服务

4、器端接收客户端的连接请求,并根据设定的值向客户端发送接受请求确认信号,并同时向客户端发出登录成功信息确认对话框。 第四步,客户端输入登录信息并确认后,就会向服务器端发送,服务器端接收到客户端发来的用户信息后,就开始对客户端所输入的客户进行合法性确认,如果不符合登录条件,则拒绝用户的连接。 第五步,如果服务器端确认客户端所输入的用户符合服务器端计算机的条件,则服务器端允许客户端进行进一步的连接,这样,整个软件的连接过程就完成了。2.系统软件模型 在本软件设计中,采用典型的c/s结构,由客户端与服务端两部分构成。客户/服务器模式的最显著特点是非对等作用,即客户相对于服务器处于不平等的地位,服务端提

5、供服务,客户端提供请求。 在设计客户端和服务器时,由于功能需求不同,我设计的客户端界面简单,面向对象,并且由相应的帮助文件,易于操作。而服务器端主要实现控制功能实现。而且不能让用户强行关闭,界面就简单,而且要做到隐藏。其他详细的功能模块描述将在第四章具体功能模块实现中给予描述。以下两章详细介绍了本程序的实现的基础和过程:三、c/s模式远程控制程序设计实现1客户端(监控端)设计 相对服务器端(受控端)的设计,客户端较为简单。客户端设计是,选用了mfc apwizard(exe),的基本对话框。在窗口上添加一些控件。修改相应的编辑框属性。添加相应的成员变量。从图4.2.1可以清楚的看到,在未登录服

6、务器之前,注销,直接控屏和发送按钮以及要发送的命令的edit窗口都是disable的,同时,本软件设置了一个信息显示窗口,用来接收服务器端发回来的反馈消息。在软件运行前,会先运行一个提示注册的窗口。主界面如图4.1所示: 图4.12服务器端(被监控端)程序设计 被控端程序是远程控制软件的主体。远程控制软件的具体功能都是再被控制端实现的,主控端只负责传送要执行的命令和显示返回的结果。而几乎所有的操作控制都时在被控端本地实现的。远程控制的被控端要求自动运行,同时还应该要具有一定的隐藏性,不容易被客户端用户发现和关闭,当然,这要在window任务管理器里看不到。故界面简单,并且自动改成和系统配置中的

7、名称相近的名称。这样才不容易被客户端用户发现。 在设计被控端的实现过程中,新建一个项目,“mfc appwizard(exe)”,选择“单文档界面”,取名server。套用windows sockets,由于服务器端基本功能都是在serverview中实现的,所以,可以把除了“文件”项以外的项全删除。 在实现服务器设计时,在初始化window socket时,通过指定 m_pmainwnd-showwindow(sw_hide);使程序的主界面不显示。在server.cpp里声明并定义自动运行函数regis()和隐藏进程函数hideproc();在serverdoc.cpp里定义默认端口。其他

8、主要功能模块都是在serverview.cpp中实现的。本程序主要实现了九个功能,具体实现步骤如下: 本程序流程图如图4.7所示: 3客户端和服务器端交互方式的实现如图4.10所示:(已经建立连接)4、其他功能的实现: 其他功能,如锁住屏幕和屏幕解锁通过调用enablewindow()函数可以很简单的实现,如锁住屏幕,只需要先得到系统当前的信息,然后 enablewindow(getdesktopwindow(),false),就可以实现了,当要解除锁屏时,只需要再执行上面的函数,把参数“false”改为“true”就可以了。 本程序的功能模块中还有一个功能模块叫做“使硬盘隐形共享”,该功能模

9、块可以共享指定的盘,同时,能够使受控端用户不能在资源管理器中发现已经共享的盘号。实现该功能模块主要是通过修改注册表来实现的。在注册表中,存储硬盘号信息的注册表路径为: “softwaremicrosoftwindowscurrentversionnetwordlanman”,只要获取这条路径,在加上查找要共享的盘符通过创建一个注册表新键值,并且将键值做相应的修改就可以实现了。具体实现源代码可见附录的,cserverview:myshare();5、代码a.客户端主要功能实现源代码:int cclientdlg:onscreen() /直接控屏/ todo: add your control n

10、otification handler code herehinstance m_hinstance=afxgetinstancehandle();m_cssend=scr;updatedata(false);onsend();loadstring(m_hinstance,ids_app_title,sztitle,max_loadstring);loadstring(m_hinstance,idc_socksever,szwindowclass,max_loadstring);myregisterclass(m_hinstance);/屏幕窗口初始化if (!myinitinstance(m

11、_hinstance)return false;return true;/-/屏幕控制窗口类atom myregisterclass(hinstance hinstance)wndclassex wcex;/指定类参数wcex.cbsize=sizeof(wndclassex);/窗口风格wcex.style=cs_hredraw|cs_vredraw;/消息处理函数wcex.lpfnwndproc=(wndproc)wndproc;wcex.cbclsextra=0;wcex.cbwndextra=0;wcex.hinstance=hinstance;/窗口图标wcex.hicon=load

12、icon(hinstance,(lpctstr)idr_mainframe);wcex.hcursor=loadcursor(null,idc_arrow);/背景颜色wcex.hbrbackground=(hbrush)(color_window+1);/不带菜单wcex.lpszmenuname=null;wcex.lpszclassname=szwindowclass;wcex.hiconsm=loadicon(wcex.hinstance,(lpctstr)idi_small);return registerclassex(&wcex);/-/创建屏幕控制窗口,并初始化套接字bool

13、myinitinstance(hinstance hinstance)hwnd hwnd;hinst=hinstance;hwnd=createwindow(szwindowclass,sztitle,ws_overlappedwindow,cw_usedefault,0,cw_usedefault,0,null,null,hinstance,null); if (!hwnd) return false; syshwnd=hwnd; /正常方式显示窗口 showwindow(hwnd,sw_show); updatewindow(hwnd); if(!inisock(syshwnd) mess

14、agebox(0,套接字连接错误!,远程控制,mb_ok|mb_applmodal); return true;/-/消息处理函数lresult callback wndproc(hwnd hwnd,uint message,wparam wparam,lparam lparam)int wmid,wmevent;switch(message)case wm_command:wmid=loword(wparam);wmevent=hiword(wparam);return defwindowproc(hwnd,message,wparam,lparam);break; case wm_dest

15、roy:closesocket(serversock);connect=false;break;case wm_mousemove:if(connect&mouseeventflag)mouseevent(us_mousemove,hwnd);break; case wm_lbuttondown:if (connect&mouseeventflag)mouseevent(us_mouseld,hwnd);break; case wm_lbuttonup:if(connect&mouseeventflag)mouseevent(us_mouselu,hwnd);break; case wm_rb

16、uttondown:if(connect&mouseeventflag)mouseevent(us_mouserd,hwnd);break; case wm_rbuttonup:if(connect&mouseeventflag)mouseevent(us_mouseru,hwnd);break; case wm_timer:if(connect&bitflag)bitflag=false;dibevent(hwnd);bitflag=true;default:return defwindowproc(hwnd,message,wparam,lparam);return 0;/-/初始化套接字

17、bool inisock(hwnd hwnd)word wversionrequested;wsadata wsadata;wversionrequested=makeword(2,0);int err=wsastartup(wversionrequested,&wsadata);if(err=-1)messagebox(0,套接字初始化错误!,远程控制,mb_ok|mb_applmodal); return false;connect=true;/设置计时器 settimer(hwnd,idt_timer,us_time,null);return true;/-/连接套接字bool conn

18、ectsock()int msgsock;/分配套接字serversock=socket(af_inet,sock_stream,0);if(serversock0)messagebox(0,套接字初始化错误!,远程控制,mb_ok|mb_applmodal);return false;/开始连接server.sin_family=pf_inet;server.sin_port=htons(4096);server.sin_addr.s_addr=inet_addr(m_csip);msgsock=connect(serversock,(struct sockaddr*)&server,siz

19、eof(server);if(msgsock!=0)return false;return true;/-void sendmousepoint(hwnd hwnd)point point,point1;rect rect;hdc hdc;long x,y;float fx,fy;int clientwidth,clientheight;/获得窗口的高度和宽度recv(serversock,(char*)&clientwidth,sizeof(clientwidth)+1,0);recv(serversock,(char*)&clientheight,sizeof(clientheight)+

20、1,0);/获取鼠标位置getcursorpos(&point);hdc=getdc(hwnd);getdcorgex(hdc,&point1);point.x=point.x-point1.x;point.y=point.y-point1.y;getclientrect(hwnd,&rect);fx=(float)point.x;fy=(float)point.y;fx=fx*clientwidth/rect.right;fy=fy*clientheight/rect.bottom;point.x=(long)fx;point.y=(long)fy;x=point.x;y=point.y;/

21、发送鼠标位置send(serversock,(char*)&x,sizeof(x)+1,msg_oob);send(serversock,(char*)&y,sizeof(y)+1,msg_oob);/-/鼠标事件处理void mouseevent(int msg,hwnd hwnd)int flag;/连接套接字connect=connectsock();if(!connect)messagebox(0,套接字连接错误!,远程控制,mb_ok|mb_applmodal);/recv(serversock,(char*)&flag,sizeof(flag)+1,0);if(flag=us_fl

22、ag)/发送鼠标移动信息send(serversock,(char*)&msg,sizeof(msg)+1,msg_oob);sendmousepoint(hwnd);/-/位图处理函数void dibevent(hwnd hwnd)int flag,msg;int bitwidth,bitheight;rect rect;connect=connectsock();if(!connect)messagebox(0,套接字连接错误!,远程控制,mb_ok|mb_applmodal);/获得窗口的高度和宽度getwindowrect(hwnd,&rect);bitwidth=rect.right

23、-rect.left;bitheight=rect.bottom-rect.top;recv(serversock,(char*)&flag,sizeof(flag)+1,0);if(flag=us_flag)mouseeventflag=false;/fasongxinximsg=us_desktopbit;send(serversock,(char*)&msg,sizeof(msg)+1,msg_oob);send(serversock,(char*)&bitwidth,sizeof(msg)+1,msg_oob);send(serversock,(char*)&bitheight,siz

24、eof(msg)+1,msg_oob);getdesktopbit(hwnd);mouseeventflag=true;closesocket(serversock);/-/系统事件处理void sysevent(int msg,hwnd hwnd)int flag;connect=connectsock();if(!connect)messagebox(0,套接字连接错误!,远程控制,mb_ok|mb_applmodal); recv(serversock,(char*)&flag,sizeof(flag)+1,0);if(flag=us_flag)send(serversock,(char

25、*)&msg,sizeof(msg)+1,msg_oob);/-/获取桌面,转换成位图void getdesktopbit(hwnd hwnd)char *buf;buf=new charus_maxsize;int len;int flag;dword bitsize;hdc hdc;handle hdib;rect rect;byte *p,*p1;flag=us_dibflag;recv(serversock,(char*)&bitsize,sizeof(bitsize)+1,0);send(serversock,(char*)&flag,sizeof(flag)+1,msg_oob);

26、/为位图分配内存hdib=globalalloc(gmem_moveable,bitsize);p=(lpbyte)globallock(hdib);p1=p;for(word i=0;ibitsize/us_maxsize;i+)len=recv(serversock,buf,us_maxsize,0);copymemory(p1,buf,us_maxsize);p1=p1+us_maxsize;send(serversock,(char*)&flag,sizeof(flag)+1,msg_oob);if(bitsize%us_maxsize)len=recv(serversock,buf,

27、bitsize%us_maxsize,0);copymemory(p1,buf,len);p1=p1+bitsize%us_maxsize;send(serversock,(char*)&flag,sizeof(flag)+1,msg_oob);p1=p1-bitsize;hdc=getdc(hwnd);getclientrect(hwnd,&rect);int color=(1bibitcount);if(color256)color=0;stretchdibits(hdc,0,0,rect.right,rect.bottom,0,0, (lpbitmapinfoheader)p)-biwi

28、dth, (lpbitmapinfoheader)p)-biheight, (lpbyte)p+(sizeof(bitmapinfoheader)+color*sizeof(rgbquad), (lpbitmapinfo)p,dib_rgb_colors,srccopy);/释放globalfree(hdib);releasedc(hwnd,hdc);delete buf;b.服务器端主要功能实现源代码:/直接控屏int autorun()msg msg;/初始化套接字if (!inisock()return 0;if(!connectsock()/连接套接字return 0;/接收数据whi

29、le(true)if(!acceptdata()wsacleanup();exit(1);if(!getdata()if(!inisock()return 0;if(!connectsock()return 0;closesocket(newsock);return msg.wparam;/-/初始化套接字bool inisock()int status;word wmajorversion,wminorversion;word wversionreqd;wsadata lpmywsadata;wmajorversion=major_version;wminorversion=minor_ve

30、rsion;wversionreqd=makeword(wmajorversion,wminorversion);status=wsastartup(wversionreqd,&lpmywsadata);if(status!=0)return false;return true;/-/连接套接字bool connectsock()int status;clientsock=socket(af_inet,sock_stream,0);if(clientsock=invalid_socket)returnfalse;dstclient_addr.sin_family=pf_inet;dstclie

31、nt_addr.sin_port=htons(4069);dstclient_addr.sin_addr.s_addr=inaddr_any;status=bind(clientsock,(struct sockaddr far*)&dstclient_addr,sizeof(dstclient_addr);if(status!=0)return false;status=listen(clientsock,1);if(status!=0)return false;return true;/-/接收数据bool acceptdata()int len=sizeof(dstclient_addr

32、);newsock=accept(clientsock,(struct sockaddr far *)&dstclient_addr,&len);if(newsock0)closesocket(clientsock);return false; /获得分辨率syswidth=getsystemmetrics(sm_cxscreen);sysheight=getsystemmetrics(sm_cyscreen);return true;/-/获取数据bool getdata()int imsg,length;point point ;int falg;falg=us_flag;send(new

33、sock,(char*)&falg,sizeof(falg)+1,msg_oob);length=recv(newsock,(char*)&imsg,sizeof(imsg)+1,0);if(length0)closesocket(newsock);closesocket(clientsock);return false;if(imsgsyswidth) bitwidth=syswidth; if(bitheightsysheight) bitheight=sysheight; /转换为位图格式 hbit=getsrcbit(bitwidth,bitheight); hdib=ddbtodib

34、(hbit); dword bitsize=globalsize(hdib); send(newsock,(char *)&bitsize,sizeof(bitsize)+1,msg_oob); recv(newsock,(char *)&bitmsg,sizeof(bitmsg)+1,0); plmagepoint=(lpbyte)hdib; for(word i=0;ibitsize/us_maxsize;i+) send(newsock,(char *)plmagepoint,sizeof(byte)*us_maxsize,msg_oob);plmagepoint=plmagepoint

35、+us_maxsize;recv(newsock,(char *)&bitmsg,sizeof(bitmsg)+1,0); if (bitsize%us_maxsize) send(newsock,(char *)plmagepoint,sizeof(byte)*globalsize(hdib)%us_maxsize,msg_oob); recv(newsock,(char *)&bitmsg,sizeof(bitmsg)+1,0); deleteobject(hbit); globalfree(hdib);/-/图形转换handle ddbtodib(hbitmap bitmap)bitma

36、p bm;bitmapinfoheader bi;lpbitmapinfoheader lpbi;dword dwlen;handle hdib;handle handle;hdc hdc;hpalette hpal;hpal=(hpalette) getstockobject(default_palette);/活动位图信息getobject(bitmap,sizeof(bm),(lpstr)&bm);/初始化位图头信息bi.bisize=sizeof(bitmapinfoheader);bi.biwidth=bm.bmwidth;bi.biheight=bm.bmheight;bi.bip

37、lanes=1;bi.bibitcount=4;bi.bicompression=bi_rgb;bi.bisizeimage=0;bi.bixpelspermeter=0;bi.biypelspermeter=0;bi.biclrused=0;bi.biclrimportant=0;int ncolors=(1256)ncolors=0;dwlen=bi.bisize+ncolors*sizeof(rgbquad);hdc=getdc(null);hpal=selectpalette(hdc,hpal,false);realizepalette(hdc);hdib=globalalloc(gm

38、em_fixed,dwlen);if(!hdib)selectpalette(hdc,hpal,false);releasedc(null,hdc);return null;lpbi=(lpbitmapinfoheader)hdib;*lpbi=bi;getdibits(hdc,bitmap,0l,(dword)bi.biheight,(lpbyte)null,(lpbitmapinfo)lpbi,(dword)dib_rgb_colors);bi=*lpbi;if(bi.bisizeimage=0)bi.bisizeimage=(bi.biwidth*bi.bibitcount)+31)&31)/8)*bi.biheight;dwlen+=bi.bisizeimage;if(handle=globalrealloc(hdib,dwlen,gmem_moveable)hdib=handle;elseglo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论