通达学院
2014/2015 学年 第 1 学期
课程设计 实验报告
模 块 名 称 远程计算机监控系统
专 业 通信
学 生 班 级 70
学 生 学 号 11007034
学 生 姓 名
指 导 教 师
设计题目
远程计算机监控系统
任务要求
远程桌面控制是控制远程计算机的网络通信程序,该程序可让您同时访问不同的远程计算机,无论何时何地,但是 ,因为NAT,PPPoE,DHCP ,和VPN,或一些最新的技术的陆续出现,使该程序功能越受到重视。
实验设备及软件
计算机
(Visual C++ 6.0)
同组人员学号及姓名
参考文献
参考格式:
[1] 丁展 刘海英.windows网络通信编程[M].人民邮电出版社,2005,20(6): 33~36
[2] 陈家琪.C程序设计教程[M].北京:新华出版社,2004.11.
[3] 侯俊杰. 深入浅出MFC第二版[M] 华中科技大学出版社
目 录
1.1 任务内容: 4
1.2应完成内容 4
二.需求
4
2.1用户需求 5
2.2可采用的技术
5
2.3 可行性技术研究 5
三.
图设计 6
3.1事件驱动的程序设计 6
3.2 …用户界面对象对象介绍 8
四.程序设计 10
4.1 …绑定的线程函数ClientThread的实现 10
4.2 …鼠标键盘模拟消息的源代码部分 12
五.设计小结 17
计算机远程监控系统
一.设计要求
1.1 任务内容:
基于Windows的远程控制软件开发毕业设计的主要任务是要求做出从系统角度
计的远程控制模式,并制作相应实用软件。
采用服务器(Server),客户端(Client)模式,使用Socket编程的基本原理及Windows的消息系统。实现基本的远程控制要求,界面新颖友好。用VC开发!
要求:
1).远程控制模式架构,如基于主从模式;
2).远程控制功能实现,如开关机,远程监视;
3).远程控制安全考虑;
4).远程控制实现平台与技巧;
5).远程控制软件实现,要求至少能在两台电脑上正常运行;
6).界面新颖友好。
1.2应完成内容
1).远程控制模式架构,如基于主从模式;
2).远程控制功能实现,如开关机,远程监视;
3).远程控制安全考虑;
4).远程控制实现平台与技巧;
5).远程控制软件实现,要求至少能在两台电脑上正常运行;
6).界面新颖友…
二.需求分析
计算机技术支持的业务运营支撑系统是随着市场经营的需要不断得到完善和提高的。系统功能上经历了从最初的资料录入管理到生产派单管理、生产流程管理、统计管理、业务组织管理,一直到决策支持管理的过程.但是因应系统建设的需要,我们必须给出一个清晰的合理的业务定义——需求分析就是一个比较合适的方法。
2.1用户需求
当您在办公室或商务旅行,但有时,你可能需要做一些事必须试用你家里的电脑,例如:阅读您的电子书或阅读您的电子邮件
这是当远程访问软件出场的时候了!它能帮助你访问远程计算机就像访问本地计算机一样,距离不再是问题! 远程桌面控制显示另一台计算机的屏幕(透过网际网络或本地网络)在您自己的屏幕上。该程序允许你利用你的鼠标和键盘来控制其他的计算机远程。这意味着您可以在远程计算机工作,就像你坐在它前面一样。
2.2可采用的技术方案
远程监控系统的实现主要采用了套接字这项技术和虚拟鼠标键盘消息的API,在大多数情况下套接字是底层传输代码的必选技术。Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。该程序采用TCP协议,因为流控和差控的存在使得传输更具有稳定性。UDP虽然效率更高,但是有掉包的情况出现,这是本方案所不允许的。
通过SOCKET传递的虚拟消息结构体到对端,被对端主机解释并虚拟,最终达到程序目的。
2.3 可行性技术研究
技术可行性
本次开发所用到的一系列的技术已是累积了几十年的技术,这些技术在这么多年的发展中并没有被淘汰,反而是越来越来热门。当初远程控制这门技术在DOS时代就已经存在,
只是受网络的制约,但是此时这门技术还是受网络技术制约着。网络流量的问题是造成所有通信程序的不稳定性的罪魁祸首。但是本程序在局域网中是完全能够实现的,而且本程序也是专门为企业网内部所设计,因为数据信息没被加密,如果想走Internet,则需建立VPN。
经济可行性
本软件成本低廉,要的只是两个ISP分发的IP地址,而且这也多用于局域网或企业网等内网,就更谈不上成本上的问题。但是如果需要对程序的质量提高可以购买MD5算法,对传输数据进行加密。
三.流程图设计
3.1事件驱动的程序设计
…传统的MS-DOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。一个程序是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。它的基本模型所示。
事件驱动程序设计是一种全新的程序设计方法。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图所示:
Windows操作系统包括三个内核基本元件:GDI, KERNEL ,USER。其中GDI(图形设备接口)负责在屏幕上绘制像素、打印硬拷贝输出,绘制用户界面包括窗口、菜单、对话框等。系统内核KERNEL支持与操作系统密切相关的功能:如进程加载,文本切换、文件I/O,以及内存管理、线程管理等。USER为所有的用户界面对象提供支持,它用于接收和管理所有输入消息、系统消息并把它们发给相应的窗口的消息队列。消息队列是一个系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程。每个窗口维护自己的消息队列,并从中取出消息,利用窗口函数进行处理。框图如下
3.2 …用户界面对象对象介绍
窗口
窗口是用户界面中最重要的部分。它是屏幕上与一个应用程序相对应的矩形区域,是用户与产生该窗口的应用程序之间的可视界面。每当用户开始运行一个应用程序时,应用程序就创建并显示一个窗口;当用户操作窗口中的对象时,程序会作出相应反应。用户通过关闭一个窗口来终止一个程序的运行;通过选择相应的应用程序窗口来选择相应的应用程序。一个典型的窗口外观所示。
说明
这是一个基本的网络拓扑原型,更多的网络拓扑原型可以自己定制。
客服端PC监控服务器端PC,这是一个简单的CS模型架构。客服器端PC通过
TCP协议与服务器端PC建立连接,这是一个三次握手的过程。建立连接后,
两台主机及可以互相通信。
逻辑模型
四.程序设计
4.1 …绑定的线程函数ClientThread的实现
DWORD WINAPI ClientThread(LPVOID lpParam)
{
HWND hWnd;
SOCKET MySocket;
FD_SET SocketSet;
struct timeval timeout;
char szMessage[2049];
DWORD iRecv;
struct myStruct *myStructure;
DWORD iLength;
DWORD iRet;
int iUpdates;
myStructure = (struct myStruct *)lpParam;
MySocket = myStructure->Socket;
hWnd = myStructure->hWnd;
timeout.tv_sec = 0; // 秒
timeout.tv_usec = 0; // 微秒
SocketSet.fd_count = 1;
SocketSet.fd_array[1] = MySocket;
while(TRUE)
{
iRet = select(0,&SocketSet,NULL,NULL,&timeout);
if (iRet != 0)
{
memset(szMessage,'\0',sizeof(szMessage))
iRecv = recv(MySocket,szMessage,2048,0);
szMessage[iRecv] = '\0';
if (strncmp(szMessage,"REFRESH",7) == 0)
{
iUpdates = SendRegionDisplay(hServerWnd,MySocket);
}
else if (strncmp(szMessage,"WM_",3) == 0)
{
DispatchWMMessage(szMessage);
iLength = strlen(szMessage);
if (iLength > 0)
goto CHECK_MSG;
}
else if (strncmp(szMessage,"RESOLUTION",10) == 0)
{
SendResolution(MySocket);
}
else if (strncmp(szMessage,"DISCONNECT",10) == 0)
{
fChange = FALSE;
fDIBitmap = FALSE;
pGdiNode = GdiStart.pNext;
while (pGdiNode)
{
free(pGdiNode->Gdi.pDIBitmap);
free(pGdiNode->Gdi.pDIBChangeStart);
pGdiNode->Gdi.fDIBitmap = FALSE;
pGdiNode->Gdi.fChange = FALSE;
pGdiNode = pGdiNode->pNext;
}
break;
}
}
}
closesocket(MySocket);
return 0;
}
4.2 …鼠标键盘模拟消息的源代码部分
break;
}
}
if (fWMKeyBdMsg)
{
if (iMessage == 1)
{
keybd_event((BYTE)vk,(BYTE)vk,0,0);
}
else if (iMessage == 2)
{
keybd_event((BYTE)vk,(BYTE)vk,KEYEVENTF_KEYUP,0);
}
}
iParms++;
if (iParms == 5)
break;
}
pCommandNode = CommandStart.pNext;
if (pCommandNode)
{
UINT keyFlags;
int iMessage;
int fWMMouseMsg;
double iScaleX,iScaleY,iX,iY;
DWORD dwX,dwY;
int fWMKeyBdMsg;
UINT vk;
int fDown;
int cRepeat;
UINT flags;
pCommandNode = pCommandNode->pNext;
keyFlags = atoi(pCommandNode->Command.szElement);
break;
}
}
if (fWMMouseMsg)
{
iScaleX = 65535.0 / (iWidth - 1);
iScaleY = 65535.0 / (iHeight - 1);
iX *= iScaleX;
iY *= iScaleY;
dwX = (DWORD)iX;
dwY = (DWORD)iY;
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);
}
else if (iMessage == 3)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);
}
else if (iMessage == 4)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);
else if (strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KU\0") == 0)
iMessage = 2;
pCommandNode = pCommandNode->pNext;
vk = atoi(pCommandNode->Command.szElement);
pCommandNode = pCommandNode->pNext;
fDown = atoi(pCommandNode->Command.szElement);
pCommandNode = pCommandNode->pNext;
cRepeat = atoi(pCommandNode->Command.szElement);
pCommandNode = pCommandNode->pNext;
flags = atoi(pCommandNode->Command.szElement);
void DispatchWMMessage(char *szString)
{
struct {char *szWMMouseMsg;}
WMMouseMsg[] = {"WM_MM","WM_LBD","WM_LBU","WM_LBK",
"WM_MBD","WM_MBU","WM_MBK",
"WM_RBD","WM_RBU","WM_RBK"};
struct {char *szWMKeyBdMsg;}
WMKeyBdMsg[] = {"WM_KD","WM_KU"};
struct {char *szMsg;}
Msg[] = {"WM_COMP","WM_GRID","WM_CMOD"};
int nWMMouseMsg;
int nWMKeyBdMsg;
int nMsg;
struct CommandList CommandStart;
struct CommandList *pCommandNode;
struct CommandDS Command;
char *pDest;
int iLoc,nChar;
int iLoop,iParms;
char szString2[2049];
nWMMouseMsg = (int)(sizeof(WMMouseMsg)/sizeof(WMMouseMsg[0]));
nWMKeyBdMsg = (int)(sizeof(WMKeyBdMsg)/sizeof(WMKeyBdMsg[0]));
nMsg = (int)(sizeof(Msg)/sizeof(Msg[0]));
CommandStart.pNext = NULL;
pCommandNode = &CommandStart;
iParms = 0;
while (pDest = strchr(szString,';'))
{
iLoc = pDest - szString;
nChar = iLoc;
memset(Command.szElement,'\0',sizeof(Command.szElement));
strncpy(Command.szElement,szString,nChar);
pCommandNode = Add_Command(pCommandNode,Command);
memset(szString2,'\0',sizeof(szString2));
strcpy(szString2,&szString[iLoc + 1]);
strcpy(szString,szString2);
五.设计小结
这是一个基本的网络拓扑原型,更多的网络拓扑原型可以自己定制。
客服端PC监控服务器端PC,这是一个简单的CS模型架构。客服器端PC通过
TCP协议与服务器端PC建立连接,这是一个三次握手的过程。建立连接后,
两台主机及可以互相通信。
由于经验不足,课程设计设计难免有许多不周全的地方,在这里非常感谢我的组,我们共同解决了很多问题,让我学会了如何透彻的理解网络通信原理和实技巧。以及理论和实践有冲突时,要两相结合来考虑问题,从而寻找良好的解决方案
设计成绩评定
评分内容
具体要求
总分
评分
上机时间
上机时间是否达到要求的学时,按照实际情况给与一定的成绩。
10分
报告审阅结果
报告结构严谨,文字通顺,用语符合技术规范,图表清楚,书写格式规范,不与别人雷同。
30分
验收结果
原理
原理清楚,能较好地理解课题任务并提出实施方案。
20分
完成情况
独立完成
设计任务,论证、分析、设计、计算、结构、建模、实验正确合理,有一定的创新。
30分
操作
能熟练操作相关工具软件,并利用工具软件完成设计任务。
10分
总成绩(五分制)
100分
指导教师评阅意见