局域网内主机监控系统
目录
- 引言 2
1.1 编写目的 2
1.2 项目背景 2
1.3 课题内容和要求 3
1.4 名词解释 4
参考文献 4 - 需求分析 5
2.1 现有系统概述 5
2.2 对新系统的要求 5
2.3 系统要求 6
2.4 对功能的规定 6
2.5 对性能的规定 6
2.6 运行环境规定 7
2.6.2 软件配置 7 - 系统架构 7
3.1 系统拓扑结构 7
3.2 系统工作过程 8
3.3 系统框架 9 - 系统概要设计 10
4.1 系统概貌 10
4.2 主要功能模块描述 11
4.3 基本设计概念和处理流程 12
4.4 系统活动流程描述 12
4.4 主要模块概要设计 13
4.4.1 Socket 概要设计 14
4.4.2 多线程概要设计 17
4.5 图形界面设计 17
4.6 系统出错处理设计 19
4.3.2 补救措施 19 - 系统详细设计 19
5.1 主要常量定义 20
5.2 主要模块实现 20
5.2.2 连接的建立与取消 21
5.2.3 Socket 的设计与实现 22
5.2.4 多线程的建立与实现 24
5.4 图形界面设计及实现 24
5.4.1 窗口类 CWnd 24
5.4.2 下拉层叠式菜单的实现 25
5.4.3 工具栏的实现 25
5.4.4 状态栏的实现 27 - 系统的运行和测试 27
6.1 运行环境说明 27
6.2 运行和测试 28
6.2.1 系统主界面展示 28
6.2.2 连接菜单展示以及连接建立测试 29
6.2.3 色彩选择测试 32
6.2.4 图像压缩选择测试 34
6.2.5 控制对方桌面测试 35
6.2.6 “显示”菜单展示以及包含功能测试 37
6.2.7 “帮助”菜单展示 40
6.3 结论 41 - 调试过程中的问题 41
7.1 Socket 创建失败 41
7.2 内存溢出 42
7.3 Socket 数据传输错误 42
7.4 多线程弹出对话框错误 42
7.5 位图显示错误 43
7.6 子窗口建立崩溃 44
7.7 未解决的问题: 44 - 课程设计总结 45
8.1 总结 45
8.2 展望 46
致 谢 46
附 录 47
Ⅰ 参考书目和网页 47
Ⅱ ReadMe 文件展示 47
2.需求分析
2.1现有系统概述
在此次开发之前,我们拥有一个原型系统,仅可实现远程监控功能,无图形界面。这会给用户带来几个问题:①只监控会不方便用户使用,无法实现控制功能也未满足远程控制系统的需求;②监控是通过将对方电脑屏幕截屏然后进行图像传输实现的,图像不进行压缩导致传输过程慢、卡顿明显,用户体验不佳;③ 原先并没有考虑用户实际的机器性能问题,全部以 256 色图像传输,这在用户机器性能不佳的情况下更加重了传输复旦;④一次只能监控一个电脑,但这并不符合实际的用户需求,我们的目标客户为企业的管理者,需要一次监控多台电脑以达到高校的办公需求;⑤无信息发送与文件传输功能,这导致监控端与被监控端交互困难,不利于提高企业工作效率;⑥无图形界面设计,给用户使用带来不便。因此现有系统将针对以上几点,采用“原型法”的开发方法进行改善。
2.2对新系统的要求
根据 2.1 节对现有系统的描述,我们可以清晰的知道现有系统目前的缺陷。因此我们针对以上缺陷,采用“原型法”的开发方法对新系统增加如下功能:① 实现远程控制功能,包括被监控端的鼠标、键盘以及外部设备接口等;②采用不同的压缩算法,供用户根据实际情况选择;③提供 1、4、8、24 位色彩显示方案, 供用户根据实际情况以及个人喜好选择;④可同时监控、控制多台电脑;⑤增加消息传输、命令传输以及文件传输功能;⑥增加友好的图形界面,改善客户体验、方便客户使用。
2.3系统要求
使用远程控制软件进行远程控制,首先要使客户端和服务器端都处在网络中, 网络可以是局域网。其次要使被控端和控制端都处在同一种通信协议之下,一般TCP/IP 协议是多数远程控制软件首选的通讯协议。通过远程控制软件控制的双方电脑需要拥有合法的 IP 地址,而且客户端必须要明确知道服务器端的 IP 地址。为企业设计一个远程控制系统需要满足以下条件:
稳定性:监控系统在企业现代化的管理过程中占据了重要的地位,需要具有一定的稳定性以实现便捷的管理;
易维护性:一个系统的易维护性是系统的一项非常重要的指标,因此系统应易维护以降低企业的运营成本;
安全性:企业的信息数据属于企业机密,因此安全、保密工作是必须第一位考虑。然而数据在网络中传输的过程,因此为防止信息被窃听或截获,必须将数据加密。
易操作性:见解美观易操作的界面对提高企业员工的工作效率至关重要。
2.4对功能的规定
本系统主要实现的功能有:
监控、控制多台主机的桌面;
实现远程控制功能,包括被监控端的鼠标、键盘以及外部设备接口等;
提供 1、4、8、24 位色彩显示方案,供用户根据实际情况以及个人喜好选择;
采用不同的压缩算法实现对图像的压缩,供用户根据实际情况选择;
消息传输、命令传输以及文件传输功能,实现监控端与被监控端的交互;
图形界面开发,改善客户体验、提高工作效率。
2.5对性能的规定
用户界面需要简单,友好,方便操作。为了保证主控端对被控端的可靠控制, 主控端和被控端采用有连接的 TCP 协议连接。本文转载自http://www.biyezuopin.vip/onews.asp?id=15028为了到达快速有效地控制被控端, 主控端发送给被控端的命令包含的字节数应该尽量的少。其次被控端要正确的解析被控端发送的命令同时也要快速发回主控端需要的信息。
2.6运行环境规定
2.6.1硬件配置
CPU:2.40GHz
USB:可用
2.6.2软件配置
操作系统:Windows7 标准版或以上版本 64 位操作系统
开发工具:Visual C++ 6.0
开发框架:Microsoft Foundation Classes
3.系统架构
在本软件设计中,采用典型的 C/S 结构,由客户端与服务端两部分构成。非对等作用是客户/服务器模式的最显著的特点,即不平等地位的体现是客户相对于服务器的集中体现,服务端提供服务,客户端提供请求。
//Base64编码解码
/*
功能:将任意字节转为可读字符,在HTTP环境下传递较长的标识信;
处理过程:以3个字节为一组(24位),每6位扩展成8位得到4个字节(32位)
*/
#include "stdafx.h"
#include "Base64.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endifCString CBase64::m_sBase64Alphabet =
_T( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" );//密文显示int CBase64::m_nMask[] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };//子网掩码?CBase64::CBase64()
{
}CBase64::~CBase64()
{
}CString CBase64::Encode(LPCTSTR szEncoding, int nSize)//编码(要编码的字符串指针,要编码字符串长度)
{CString sOutput = _T( "" );int nNumBits = 6;//每6位编码UINT nDigit;int lp = 0;ASSERT( szEncoding != NULL );if( szEncoding == NULL )return sOutput;m_szInput = szEncoding;m_nInputSize = nSize;m_nBitsRemaining = 0;nDigit = read_bits( nNumBits, &nNumBits, lp );while( nNumBits > 0 ){sOutput += m_sBase64Alphabet[ (int)nDigit ];nDigit = read_bits( nNumBits, &nNumBits, lp );}// Pad with '=' as per RFC 1521while( sOutput.GetLength() % 4 != 0 ){sOutput += '=';//用=填充}return sOutput;
}//解码:要求编码字串长度的4/3,否则让他们同长
int CBase64::Decode(LPCTSTR szDecoding, LPTSTR szOutput)
{CString sInput;int c, lp =0;int nDigit;int nDecode[ 256 ];ASSERT( szDecoding != NULL );ASSERT( szOutput != NULL );if( szOutput == NULL )return 0;if( szDecoding == NULL )return 0;sInput = szDecoding;if( sInput.GetLength() == 0 )return 0;// Build Decode Table//for( int i = 0; i < 256; i++ )nDecode[i] = -2; // Illegal digitfor( i=0; i < 64; i++ ){nDecode[ m_sBase64Alphabet[ i ] ] = i;nDecode[ m_sBase64Alphabet[ i ] | 0x80 ] = i; //忽略第8个比特nDecode[ '=' ] = -1;nDecode[ '=' | 0x80 ] = -1; // 忽略MIME填充字符}// 清除输出缓冲区memset( szOutput, 0, sInput.GetLength() + 1 );// 编码for( lp = 0, i = 0; lp < sInput.GetLength(); lp++ ){c = sInput[ lp ];nDigit = nDecode[ c & 0x7F ];if( nDigit < -1 ){return 0;}else if( nDigit >= 0 )//递增排序iwrite_bits( nDigit & 0x3F, 6, szOutput, i );}return i;
}UINT CBase64::read_bits(int nNumBits, int * pBitsRead, int& lp)
{ULONG lScratch;while( ( m_nBitsRemaining < nNumBits ) &&( lp < m_nInputSize ) ){int c = m_szInput[ lp++ ];m_lBitStorage <<= 8;m_lBitStorage |= (c & 0xff);m_nBitsRemaining += 8;}if( m_nBitsRemaining < nNumBits ){lScratch = m_lBitStorage << ( nNumBits - m_nBitsRemaining );*pBitsRead = m_nBitsRemaining;m_nBitsRemaining = 0;}else{lScratch = m_lBitStorage >> ( m_nBitsRemaining - nNumBits );*pBitsRead = nNumBits;m_nBitsRemaining -= nNumBits;}return (UINT)lScratch & m_nMask[nNumBits];
}void CBase64::write_bits(UINT nBits,int nNumBits,LPTSTR szOutput,int& i)
{UINT nScratch;m_lBitStorage = (m_lBitStorage << nNumBits) | nBits;m_nBitsRemaining += nNumBits;while( m_nBitsRemaining > 7 ){nScratch = m_lBitStorage >> (m_nBitsRemaining - 8);szOutput[ i++ ] = nScratch & 0xFF;m_nBitsRemaining -= 8;}
}