D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文)...

103
四四四四四四四四四四 四四四 () 四四四四四四四 四四 四四四 04101026135 四四四四 04四01四 四四四四 四四 四四四四四四四四四四四四 四O 0四四四四

Transcript of D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文)...

Page 1: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四 川 理 工 学 院 毕 业 设 计 ( 论 文 )

远 程 桌 面 监 控 系 统 开 发

学 生 : 王 蓬 超学 号 : 04101026135

专 业 : 软 件 工 程班 级 : 04 级 01 班指 导 教 师 : 袁 超

四 川 理 工 学 院 计 算 机 科 学 系二 O 0 八 年 五 月

Page 2: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

远程桌面监控开发

摘 要

远 程 桌 面 控 制 是 控 制 远 程 计 算 机 的 网 络 通信 程 序 , 该 程 序 可 让 您 同 时 访 问 不 同 的 远 程计 算 机 , 无 论 何 时 何 地 , 但 是 , 因 为NAT , PPPoE , DHCP , 和 VPN , 或 一 些 最 新 的 技术 的 陆 续 出 现 , 使 该 程 序 功 能 越 来 越 受 到 重视 。

当 然 , 远 程 控 制 软 件 是 一 把 双 刃 剑 , 有 优点 就 会 有 缺 点 , 它 存 在 比 较 严 重 的 安 全 隐 患 。一 方 面 给 用 户 和 网 络 管 理 员 工 作 带 了 很 大 的方 便 , 另 一 方 面 也 给 一 些 居 心 不 良 者 留 下 后门 。 形 成 很 多 木 马 程 序 。 这 就 需 要 对 软 件 在设 计 方 面 做 一 些 安 全 考 虑 。

关 键 词 : TCP ; 事 件 驱 动 ; 网 络 ; 套 接 字 ;

Page 3: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

Remote Desktop Monitor System

ABSTRACT

Remote Desktop Control displays the screen of another computer (via Internet or network) on your own screen. The program allows you to use your mouse and keyboard to control the other computer remotely. It means that you can work on a remote computer, as if you were sitting in front of it.

Remote Desktop Control is so fast and comfortable that you might even forget that you are working on a remote computer! The program allows you to work with different remote computers simultaneously, from anywhere in the world.But, because of the NAT, PPPOE, DHCP, VPN, or some newest technology which deny this function realization.

Remote Desktop Control allows the user to remotely control any computer, running under the Microsoft Windows system in a TCP/IP network or the Internet. The user can see a remote desktop on his or her own screen and use the mouse and keyboard to control the connected computer remotely.

Remote Desktop Control allows you to: Display the remote computer screen on your screen in real-time. Use own keyboard and mouse to control the remote computer. Perform some operations remotely, such as: shutdown, reboot, etc.

Keywords: top; event-driven; network; socket

Page 4: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

目 录第1 章 引言...................................................................................................................... 1

1.1 主要任务.............................................................................................................. 31.1.1 任务内容:.......................................................................................................31.1.2 应完成内容............................................................................................... 3

第2 章 需求分析.............................................................................................................. 52.1 用户需求.............................................................................................................. 52.2 可采用的技术方案............................................................................................... 52.3 可行性技术研究................................................................................................... 6

2.3.1 技术可行性............................................................................................... 62.3.2 经济可行性............................................................................................... 7

第3 章 概要设计和详细设计........................................................................................... 83.1 开发工具简介....................................................................................................... 83.2 WIN32应用程序说明........................................................................................... 9

3.2.1 Windows应用程序组成........................................................................... 93.2.2 事件驱动的程序设计............................................................................... 113.2.3 用户界面对象对象介绍........................................................................... 14

3.3 网络通信设计....................................................................................................... 173.3.1 面向消息的通信方式简介....................................................................... 183.3.2 可靠性和次序性....................................................................................... 203.3.3 TCP的从容关闭....................................................................................... 203.3.4 OOP简介................................................................................................... 213.3.5 服务器端要使用的API...............................................................................223.3.6 客服端要使用的API...................................................................................253.3.7 建立连接的过程图................................................................................... 263.3.8 服务器连接代码分析............................................................................... 263.3.9 客服端代码连接分析............................................................................... 27

3.4 进程与线程........................................................................................................... 293.4.1 创建线程所使用的API...............................................................................30

3.5 消息模拟.............................................................................................................. 333.5.1 实现原理................................................................................................... 343.5.2 实现原理代码分析................................................................................... 35

3.6 图形编码.............................................................................................................. 443.7 总体框架的实现................................................................................................... 47

3.7.1 服务器端实现原理................................................................................... 473.7.2 客服端实现原理....................................................................................... 483.7.3 数据流实现原理....................................................................................... 48

3.8 设计完成感受....................................................................................................... 49第4 章 测试...................................................................................................................... 50

4.1 Testcase 的设计................................................................................................... 50

II

Page 5: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

4.1.1 测试用例1 说明....................................................................................... 504.1.2 测试用例2 说明....................................................................................... 514.1.3 测试用例3 说明....................................................................................... 514.1.4 测试结果................................................................................................... 51

第5 章 结果和结论........................................................................................................... 52致谢.......................................................................................................................................... 53参考文献.................................................................................................................................. 54附 录.................................................................................................................................. 55附录A: 软件使用说明书............................................................................................... 55附录B: 核心代码........................................................................................................... 55

5.1.1 服务器端................................................................................................... 555.1.2 客服端程序............................................................................................... 79

III

Page 6: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

IV

Page 7: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

第 1 章 引 言

网 络 在 计 算 机 世 界 里 , 越 来 越 发 挥 着 举 足轻 重 的 作 用 , 很 多 单 位 、 部 门 都 建 立 了 自 己的 内 部 网 。 对 于 网 络 管 理 人 员 来 说 , 在 整 个网 络 运 行 期 间 , 希 望 能 够 实 时 的 监 控 联 网 计算 机 的 运 行 状 态 和 进 行 一 些 相 关 操 作 ; 希 望能 够 传 输 文 件 ; 希 望 能 够 防 止 病 毒 的 蔓 延 、非 法 程 序 的 拷 贝 、 杜 绝 某 些 用 户 的 越 权 或 非法 操 作 等 。 为 此 , 希 望 编 写 一 个 适 合 于 自 己所 在 局 域 网 的 通 讯 程 序 。 在 此 , 本 人 使 用 VC

6.0 开 发 了 一 套 能 在 局 域 网 内 的 每 台 计 算 机 进行 实 时 监 控 的 网 络 系 统 。 这 也 就 是 所 谓 的 远程 控 制 软 件 。 那 什 么 是 远 程 控 制 ?

远 程 控 制 是 在 网 络 上 由 一 台 电 脑 ( 主 控 端Remote/ 客 户 端 ) 远 距 离 去 控 制 另 一 台 电 脑 ( 被控 端 Host/服 务 器 端 ) 的 技 术 , 这 里 的 远 程 不 是字 面 意 思 的 远 距 离 , 一 般 指 通 过 网 络 控 制 远端 电 脑 , 不 过 , 大 多 数 时 候 我 们 所 说 的 远 程控 制 往 往 指 在 局 域 网 中 的 远 程 控 制 而 言 。 当操 作 者 使 用 主 控 端 电 脑 控 制 被 控 端 电 脑 时 ,就 如 同 坐 在 被 控 端 电 脑 的 屏 幕 前 一 样 , 可 以

Page 8: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

启 动 被 控 端 电 脑 的 应 用 程 序 , 可 以 使 用 被 控端 电 脑 的 文 件 资 料 , 甚 至 可 以 利 用 被 控 端 电脑 的 外 部 打 印 设 备 ( 打 印 机 ) 和 通 信 设 备( 调 制 解 调 器 或 者 专 线 等 ) 来 进 行 打 印 和 访问 互 联 网 , 就 像 你 利 用 遥 控 器 遥 控 电 视 的 音量 、 变 换 频 道 或 者 开 关 电 视 机 一 样 。 不 过 ,有 一 个 概 念 需 要 明 确 , 那 就 是 主 控 端 电 脑 只是 将 键 盘 和 鼠 标 的 指 令 传 送 给 远 程 电 脑 , 同时 将 被 控 端 电 脑 的 屏 幕 画 面 通 过 通 信 线 路 回传 过 来 。 也 就 是 说 , 我 们 控 制 被 控 端 电 脑 进行 操 作 似 乎 是 在 眼 前 的 电 脑 上 进 行 的 , 实 质是 在 远 程 的 电 脑 中 实 现 的 , 不 论 打 开 文 件 ,还 是 上 网 浏 览 、 下 载 等 都 是 存 储 在 远 程 的 被控 端 电 脑 中 的 。

电 脑 中 的 远 程 控 制 技 术 , 始 于 DOS 时 代 ,只 不 过 当 时 由 于 技 术 上 没 有 什 么 大 的 变 化 ,网 络 不 发 达 , 市 场 没 有 更 高 的 要 求 , 所 以 远程 控 制 技 术 没 有 引 起 更 多 人 的 注 意 。 但 是 ,随 着 网 络 的 高 度 发 展 , 电 脑 的 管 理 及 技 术 支持 的 需 要 , 远 程 操 作 及 控 制 技 术 越 来 越 引 起人 们 的 关 注 。 远 程 控 制 一 般 支 持 下 面 的 这 些网 络 方 式 : LAN 、 WAN 、 拨 号 方 式 、 互 联 网 方

2

Page 9: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

式 。 此 外 , 有 的 远 程 控 制 软 件 还 支 持 通 过 串口 、 并 口 、 红 外 端 口 来 对 远 程 机 进 行 控 制( 不 过 , 这 里 说 的 远 程 电 脑 , 只 能 是 有 限 距离 范 围 内 的 电 脑 了 ) 。 传 统 的 远 程 控 制 软 件一 般 使 用 NETBEUI、 NETBIOS 、 IPX/SPX 、 TCP/IP 等 协议 来 实 现 远 程 控 制 , 不 过 , 随 着 网 络 技 术 的发 展 , 目 前 很 多 远 程 控 制 软 件 提 供 通 过 Web 页面 以 JAVA 技 术 来 控 制 远 程 电 脑 , 这 样 可 以 实 现不 同 操 作 系 统 下 的 远 程 控 制 , 例 如 数 技 通 科技 有 限 公 司 在 去 年 就 推 出 了 全 球 第 一 套 基 于中 文 JAVA 的 跨 平 台 远 程 控 制 软 件 ―― 易 控 。

远 程 控 制 软 件 一 般 分 两 个 部 分 : 一 部 分 是客 户 端 程 序 Client , 另 一 部 分 是 服 务 器 端 程 序Server , 在 使 用 前 需 要 将 客 户 端 程 序 安 装 到 主控 端 电 脑 上 , 将 服 务 器 端 程 序 安 装 到 被 控 端电 脑 上 。 它 的 控 制 的 过 程 一 般 是 先 在 主 控 端电 脑 上 执 行 客 户 端 程 序 , 像 一 个 普 通 的 客 户一 样 向 被 控 端 电 脑 中 的 服 务 器 端 程 序 发 出 信号 , 建 立 一 个 特 殊 的 远 程 服 务 , 然 后 通 过 这个 远 程 服 务 , 使 用 各 种 远 程 控 制 功 能 发 送 远程 控 制 命 令 , 控 制 被 控 端 电 脑 中 的 各 种 应 用程 序 运 行 , 我 们 称 这 种 远 程 控 制 方 式 为 基 于

3

Page 10: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

远 程 服 务 的 远 程 控 制 。 通 过 远 程 控 制 软 件 ,我 们 可 以 进 行 很 多 方 面 的 远 程 控 制 , 包 括 获取 目 标 电 脑 屏 幕 图 像 、 窗 口 及 进 程 列 表 ; 记录 并 提 取 远 端 键 盘 事 件 ( 击 键 序 列 , 即 监 视远 端 键 盘 输 入 的 内 容 ) ; 可 以 打 开 、 关 闭 目标 电 脑 的 任 意 目 录 并 实 现 资 源 共 享 ; 提 取 拨号 网 络 及 普 通 程 序 的 密 码 ; 激 活 、 中 止 远 端程 序 进 程 ; 管 理 远 端 电 脑 的 文 件 和 文 件 夹 ;关 闭 或 者 重 新 启 动 远 端 电 脑 中 的 操 作 系 统 ;修 改 Windows 注 册 表 ; 通 过 远 端 电 脑 上 、 下 载文 件 和 捕 获 音 频 、 视 频 信 号 等 。

前 面 所 讲 的 是 一 台 电 脑 对 一 台 电 脑 的 情 况 ,其 实 , 基 于 远 程 服 务 的 远 程 控 制 最 适 合 的 模式 是 一 对 多 , 即 利 用 远 程 控 制 软 件 , 我 们 可以 使 用 一 台 电 脑 控 制 多 台 电 脑 , 这 就 不 必 为办 公 室 的 每 一 台 电 脑 都 安 装 一 个 调 制 解 调 器 ,而 只 需 要 利 用 办 公 室 局 域 网 的 优 势 就 可 以 轻松 实 现 远 程 多 点 控 制 了 。 在 进 行 一 台 电 脑 对多 台 远 端 电 脑 进 行 控 制 时 , 远 程 控 制 软 件 似乎 更 像 一 个 局 域 网 的 网 络 管 理 员 , 而 提 供 远程 控 制 的 远 程 终 端 服 务 就 像 极 了 办 公 室 局 域网 的 延 伸 。 这 种 一 对 多 的 连 接 方 式 在 节

4

Page 11: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

省 了 调 制 解 调 器 的 同 时 , 还 使 得 网 络 的 接入 更 加 安 全 可 靠 , 网 络 管 理 员 也 更 易 于 管 理局 域 网 上 的 每 一 台 电 脑 。 远 程 控 制 具 有 一 下优 点 : 便 于 用 户 能 够 在 任 何 地 方 通 过 网 络 及时 , 快 速 的 访 问 , 控 制 自 己 的 主 机 。 特 别 是对 于 网 络 管 理 员 , 技 术 服 务 人 员 来 说 , 远 程控 制 提 供 了 一 个 便 捷 , 高 效 的 手 段 。

当 然 , 远 程 控 制 软 件 是 一 把 双 刃 剑 , 有 优点 就 会 有 缺 点 , 它 存 在 比 较 严 重 的 安 全 隐 患 。一 方 面 给 用 户 和 网 络 管 理 员 工 作 带 了 很 大 的方 便 , 另 一 方 面 也 给 一 些 居 心 不 良 者 留 下 后门 。 形 成 很 多 木 马 程 序 。 这 就 需 要 对 软 件 在设 计 方 面 做 一 些 安 全 考 虑 。

1.1 主 要 任 务

本 软 件 就 是 基 于 此 而 设 计 开 发 的 , 能 实 现 以下 的 基 本 的 远 程 功 能 :

1 ) , 查 看 被 控 制 端 的 桌 面2 ) , 查 看 被 控 制 端 的 桌 面 内 容3 ) , 强 迫 被 控 制 端 重 新 启 动 或 关 机 ;

5

Page 12: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

4 ) , 修 改 被 控 制 端 的 系 统 配 置 文 件 ;5 ) , 直 接 执 行 任 何 可 执 行 命 令 , 打 开 应 用 程序6 ) , 控 制 被 控 制 端 的 屏 幕 , 在 本 地 直 接 操 作被 控 制 端 计 算 机

1.1.1 任 务 内 容 :

    基 于 Windows 的 远 程 控 制 软 件 开 发 毕 业 设 计的 主 要 任 务 是 要 求 做 出 从 系 统 角 度计 的 远 程 控 制 模 式 , 并 制 作 相 应 实 用 软 件 。采 用 服 务 器 ( Server ) , 客 户 端 ( Client ) 模 式 ,使 用 Socket编 程 的 基 本 原 理 及 Windows 的 消 息 系统 。 实 现 基 本 的 远 程 控 制 要 求 , 界 面 新 颖 友好 。 用 VC 开 发 !要 求 : 1 ) . 远 程 控 制 模 式 架 构 , 如 基 于 主 从 模 式 ;2 ) . 远 程 控 制 功 能 实 现 , 如 开 关 机 , 远 程 监视 ;3 ) . 远 程 控 制 安 全 考 虑 ;4 ) . 远 程 控 制 实 现 平 台 与 技 巧 ;

6

Page 13: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

5 ) . 远 程 控 制 软 件 实 现 , 要 求 至 少 能 在 两 台电 脑 上 正 常 运 行 ;6 ).界面新颖友好。1.1.2 应 完 成 内 容

1 ) . 远 程 控 制 模 式 架 构 , 如 基 于 主 从 模 式 ;2 ) . 远 程 控 制 功 能 实 现 , 如 开 关 机 , 远 程 监视 ;3 ) . 远 程 控 制 安 全 考 虑 ;4 ) . 远 程 控 制 实 现 平 台 与 技 巧 ;5 ) . 远 程 控 制 软 件 实 现 , 要 求 至 少 能 在 两 台电 脑 上 正 常 运 行 ;6 ) . 界 面 新 颖 友

7

Page 14: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

第 2 章 需 求 分 析算机技术支持的业务运营支撑系统是随着市场经营的需要不断得到完善和

提高的。系统功能上经历了从最初的资料录入管理到生产派单管理、生产流程管理、统计管理、业务组织管理,一直到决策支持管理的过程。人们对计算机应用系统的态度上也经历了从开始的拒绝、怀疑、喜欢、依靠到最后渴望其无所不能的过程。

但是,我们也发现,一方面,随着业务支撑系统性能的不断提高,系统的使用人员对系统的抱怨反而越来越大――使用不方便、使用效率低、系统缺陷严重等;另外一方面,系统的造价也呈指数增长,从最初的几十万元、到几百万元到现在的上千万元。

为什么会出现这种矛盾的情况呢?开发方说需求方的业务太复杂、变动太频繁、业务与流程不规范;建设方说开发方的开发能力差,开发代价高,系统缺陷和错误多多。那么,真正的原因到底在哪里呢?

我们通过对现行系统及应用情况的分析得出的结论是:需求方与开发商之间对业务的理解和定义的混乱是造成这种状况的根本原因。由于在业务管理的过程中同时也在业务系统的建设过程中,我们都没有对业务进行定义或定义不够清晰准确,业务本身在执行过程中就出现概念不清和流程不畅等情况,那么作为以机器支撑的业务系统当然就天生具有很大的缺陷。

如何准确定义一个业务呢?这的确是一个科学加艺术的课题。但是因应系统建设的需要,我们必须给出一个清晰的合理的业务定义――需求分析就是一个比较合适的方法。

所谓需求分析就是以市场运作中的业务定义为基础,重新定义一个业务在业务系统中的概念、业务流程、数据流程、业务间关系、数据间关系等,以便于计算机高效的实现这个业务。需求分析既可以用于一个业务的具体分析,也可以用于一类业务的分析和整个业务支撑系统的分析

8

Page 15: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

2.1 用 户 需 求

当 您 在 办 公 室 或 商 务 旅 行 , 但 有 时 , 你 可能 需 要 做 一 些 事 必 须 试 用 你 家 里 的 电 脑 , 例如 : 阅 读 您 的 电 子 书 或 阅 读 您 的 电 子 邮 件 。有 时 您 可 能 生 病 和 将 不 能 够 离 开 您 的 公 寓 ,但 是 , 项 目 工 程 紧 张 , 而 您 又 需 要 完 成 这 个项 目 。 驾 驶 通 过 城 市 去 访 问 您 的 公 司 的 电 脑带 着 高 烧 , 这 不 是 一 个 真 正 的 好 主 意 。

这 是 当 远 程 访 问 软 件 出 场 的 时 候 了 ! 它 能帮 助 你 访 问 远 程 计 算 机 就 像 访 问 本 地 计 算 机一 样 , 距 离 不 再 是 问 题 ! 远 程 桌 面 控 制 显 示另 一 台 计 算 机 的 屏 幕 ( 透 过 网 际 网 络 或 本 地网 络 ) 在 您 自 己 的 屏 幕 上 。 该 程 序 允 许 你 利用 你 的 鼠 标 和 键 盘 来 控 制 其 他 的 计 算 机 远 程 。这 意 味 着 您 可 以 在 远 程 计 算 机 工 作 , 就 像 你坐 在 它 前 面 一 样 。

这 样 用 户 可 以 真 正 的 实 现 远 程 办 公 。

2.2 可 采 用 的 技 术 方 案

远 程 监 控 系 统 的 实 现 主 要 采 用 了 套 接 字 这

项 技 术 和 虚 拟 鼠 标 键 盘 消 息 的 API, 在 大 多 数 情

9

Page 16: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

况 下 套 接 字 是 底 层 传 输 代 码 的 必 选 技 术 。

Socket 可 以 看 成 在 两 个 程 序 进 行 通 讯 连 接 中 的

一 个 端 点 , 一 个 程 序 将 一 段 信 息 写 入 Socket 中 ,

该 Socket 将 这 段 信 息 发 送 给 另 外 一 个 Socket 中 ,

使 这 段 信 息 能 传 送 到 其 他 程 序 中 。 该 程 序 采

用 TCP 协 议 , 因 为 流 控 和 差 控 的 存 在 使 得 传 输

更 具 有 稳 定 性 。 UDP 虽 然 效 率 更 高 , 但 是 有 掉

包 的 情 况 出 现 , 这 是 本 方 案 所 不 允 许 的 。

通 过 SOCKET 传 递 的 虚 拟 消 息 结 构 体 到 对 端 ,

被 对 端 主 机 解 释 并 虚 拟 , 最 终 达 到 程 序 目 的 。

下 面 我 们 着 重 再 介 绍 下 什 么 是 SOCKET.

套 接 字 是 通 信 的 基 石 , 是 支 持 TCP/IP 协 议 的

网 络 通 信 的 基 本 操 作 单 元 。 可 以 将 套 接 字 看

作 不 同 主 机 间 的 进 程 进 行 双 向 通 信 的 端 点 ,

它 构 成 了 单 个 主 机 内 及 整 个 网 络 间 的 编 程 界

10

Page 17: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

面 。 套 接 字 存 在 于 通 信 域 中 , 通 信 域 是 为 了

处 理 一 般 的 线 程 通 过 套 接 字 通 信 而 引 进 的 一

种 抽 象 概 念 。 套 接 字 通 常 和 同 一 个 域 中 的 套

接 字 交 换 数 据 ( 数 据 交 换 也 可 能 穿 越 域 的 界

限 , 但 这 时 一 定 要 执 行 某 种 解 释 程 序 ) 。 各

种 进 程 使 用 这 个 相 同 的 域 互 相 之 间 用 Internet 协

议 簇 来 进 行 通 信 。

套 接 字 可 以 根 据 通 信 性 质 分 类 , 这 种 性 质

对 于 用 户 是 可 见 的 。 应 用 程 序 一 般 仅 在 同 一

类 的 套 接 字 间 进 行 通 信 。 不 过 只 要 底 层 的 通

信 协 议 允 许 , 不 同 类 型 的 套 接 字 间 也 照 样 可

以 通 信 。 套 接 字 有 两 种 不 同 的 类 型 : 流 套 接

字 和 数 据 报 套 接 字 。

要 通 过 互 联 网 进 行 通 信 , 你 至 少 需 要 一 对

套 接 字 , 其 中 一 个 运 行 于 客 户 机 端 , 我 们 称

11

Page 18: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

之 为 ClientSocket , 另 一 个 运 行 于 服 务 器 端 , 我

们 称 之 为 ServerSocket 。

根 据 连 接 启 动 的 方 式 以 及 本 地 套 接 字 要 连

接 的 目 标 , 套 接 字 之 间 的 连 接 过 程 可 以 分 为

三 个 步 骤 : 服 务 器 监 听 , 客 户 端 请 求 , 连 接

确 认 。

所 谓 服 务 器 监 听 , 是 服 务 器 端 套 接 字 并 不

定 位 具 体 的 客 户 端 套 接 字 , 而 是 处 于 等 待 连

接 的 状 态 , 实 时 监 控 网 络 状 态 。

所 谓 客 户 端 请 求 , 是 指 由 客 户 端 的 套 接 字

提 出 连 接 请 求 , 要 连 接 的 目 标 是 服 务 器 端 的

套 接 字 。 为 此 , 客 户 端 的 套 接 字 必 须 首 先 描

述 它 要 连 接 的 服 务 器 的 套 接 字 , 指 出 服 务 器

端 套 接 字 的 地 址 和 端 口 号 , 然 后 就 向 服 务 器

端 套 接 字 提 出 连 接 请 求 。

12

Page 19: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

所 谓 连 接 确 认 , 是 指 当 服 务 器 端 套 接 字 监

听 到 或 者 说 接 收 到 客 户 端 套 接 字 的 连 接 请 求 ,

它 就 响 应 客 户 端 套 接 字 的 请 求 , 建 立 一 个 新

的 线 程 , 把 服 务 器 端 套 接 字 的 描 述 发 给 客 户

端 , 一 旦 客 户 端 确 认 了 此 描 述 , 连 接 就 建 立

好 了 。 而 服 务 器 端 套 接 字 继 续 处 于 监 听 状 态 ,

继 续 接 收 其 他 客 户 端 套 接 字 的 连 接 请 求 。

2.3 可 行 性 技 术 研 究

2.3.1 技 术 可 行 性

本 次 开 发 所 用 到 的 一 系 列 的 技 术 已 是 累 积

了 几 十 年 的 技 术 , 这 些 技 术 在 这 么 多 年 的 发

展 中 并 没 有 被 淘 汰 , 反 而 是 越 来 越 来 热 门 。

当 初 远 程 控 制 这 门 技 术 在 DOS 时 代 就 已 经 存 在 ,

13

Page 20: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

只 是 受 网 络 的 制 约 , 但 是 此 时 这 门 技 术 还

是 受 网 络 技 术 制 约 着 。 网 络 流 量 的 问 题 是 造

成 所 有 通 信 程 序 的 不 稳 定 性 的 罪 魁 祸 首 。 但

是 本 程 序 在 局 域 网 中 是 完 全 能 够 实 现 的 , 而

且 本 程 序 也 是 专 门 为 企 业 网 内 部 所 设 计 , 因

为 数 据 信 息 没 被 加 密 , 如 果 想 走 Internet , 则 需

建 立 VPN 。

2.3.2 经 济 可 行 性

本 软 件 成 本 低 廉 , 要 的 只 是 两 个 ISP分 发 的

IP 地 址 , 而 且 这 也 多 用 于 局 域 网 或 企 业 网 等

内 网 , 就 更 谈 不 上 成 本 上 的 问 题 。 但 是 如 果

需 要 对 程 序 的 质 量 提 高 可 以 购 买 MD5 算 法 , 对

传 输 数 据 进 行 加 密 。

14

Page 21: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

第 3 章 概 要 设 计 和 详细 设 计

在 讨 论 远 程 监 控 的 话 题 之 前 , 必 须 明 确 什么 是 远 程 监 控 系 统 技 术 。

远 程 监 控 技 术 是 在 网 络 上 由 一 台 计 算 机 远距 离 去 控 制 另 一 台 计 算 机 的 技 术 。 这 里 的 远程 不 是 字 面 意 思 的 远 距 离 , 一 般 指 通 过 网 络控 制 远 端 电 脑 。 不 过 , 大 多 数 时 候 所 说 的 远程 控 制 往 往 指 的 是 局 域 网 中 的 远 程 控 制 或 者VPN 中 。 当 操 作 者 使 用 主 控 端 电 脑 时 , 就 如 同坐 在 被 控 端 电 脑 的 屏 幕 前 一 样 , 可 以 启 动 启动 被 控 端 的 应 用 程 序 , 可 以 使 用 被 控 端 电 脑的 文 件 资 料 , 甚 至 可 以 利 用 被 控 端 电 脑 的 外部 打 印 设 备 和 通 信 设 备 进 行 打 印 和 访 问 互 联网 , 就 像 利 用 遥 控 器 遥 控 电 视 机 一 样 。 不 过有 一 点 要 明 确 , 那 就 是 主 控 端 电 脑 只 是 将 键盘 和 鼠 标 的 指 令 传 送 给 远 程 电 脑 , 同 时 将 被控 端 电 脑 的 屏 幕 画 面 通 过 通 信 线 路 回 传 过 来 ,从 而 达 到 控 制 与 被 控 制 的 目 的 。

远 程 控 制 软 件 一 般 分 为 两 部 分 : 客 户 端 程序 和 服 务 端 程 序 。 在 使 用 前 需 要 将 客 户 端 程

15

Page 22: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

序 安 装 到 主 控 电 脑 上 , 将 服 务 器 端 程 序 安 装到 被 控 端 电 脑 上 。 控 制 的 过 程 一 般 是 先 在 被控 端 电 脑 上 执 行 服 务 器 端 程 序 , 然 后 在 控 制端 电 脑 执 行 客 服 端 程 序 , 与 服 务 器 端 建 立 一个 特 殊 的 远 程 服 务 , 然 后 通 过 这 个 远 程 服 务 ,使 用 各 种 远 程 控 制 功 能 发 送 远 程 控 制 命 令 ,控 制 服 务 器 端 的 各 种 应 用 程 序 的 运 行 。 通 过远 程 控 制 软 件 , 可 以 进 行 很 多 方 面 的 远 程 操作 , 包 括 获 取 目 标 电 脑 的 屏 幕 图 像 , 记 录 并提 取 远 端 键 盘 事 件 , 鼠 标 事 件 。 但 这 些 过 程与 网 速 有 很 大 的 关 系 。 网 速 过 慢 是 很 多 网 络程 序 的 瓶 颈 , 远 程 控 制 也 不 例 外 。 获 取 被 控端 电 脑 屏 幕 的 过 程 , 实 际 上 就 是 服 务 器 端 传输 一 副 屏 幕 图 片 到 客 服 端 的 过 程 , 这 个 过 程需 要 传 输 大 量 的 数 据 , 这 牵 涉 到 如 何 对 屏 幕图 片 数 据 进 行 压 缩 。 另 外 , 什 么 时 候 发 送 屏幕 图 片 数 据 , 是 不 是 每 次 都 需 要 发 送 整 个 屏幕 的 数 据 , 这 些 都 是 远 程 控 制 必 须 面 对 的 问题 。

16

Page 23: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

3.1开 发 工 具 简 介

本 系 统 采 用 VC++ 6.0 作 为 开 发 工 具 。 VC++ 6.0

是 一 个 可 视 化 的 完 整 的 应 用 程 序 开 发 环 境 ,

使 用 它 可 以 开 发 出 专 业 级 别 的 WINDOWS应 用 程

序 。

3.2 WIN32 应 用 程 序 说 明

WINDOWS程 序 开 发 流 程 为 程 序 代 码 和 UI 资 源 ,

两 大 部 分 。 两 部 分 最 后 以 RC 编 译 器 整 合 为 一

个 完 整 的 EXE 档 案 。 所 谓 UI 资 源 是 指 功 能 菜 单 ,

对 话 框 外 貌 , 程 序 图 标 , 光 标 形 状 等 等 东 西 。

这 些 UI 资 源 的 实 际 内 容 是 借 助 各 种 工 具 产 生 ,

并 以 各 种 扩 展 名 的 文 档 存 在 的 , 如 ISO,BMP,CUR

等 等 。 程 序 员 必 须 在 所 谓 的 资 源 描 述 文 档 .RC

中 找 到 他 们 。 RC 编 译 器 读 取 文 档 的 描 述 后 将

17

Page 24: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

所 有 的 UI 资 源 制 作 出 一 个 RES 文 档 , 在 与 程 序

代 码 结 合 在 一 起 。 其 主 导 思 想 是 消 息 驱 动 。

所 有 消 息 最 终 发 网 窗 口 程 序 队 列 等 待 处 理 。

3.2.1 Windows 应 用 程 序 组 成

1.C,CPP源 程 序 文 件 : 源 程 序 文 件 包 含 了 应 用

程 序 的 数 据 、 类 、 功 能 逻 辑 模 块 ( 包 括 事 件

处 理 、 用 户 界 面 对 象 初 始 化 以 及 一 些 辅 助 例

程 ) 的 定 义 。

  2.H,HPP 头 文 件 : 头 文 件 包 含 了 CPP 、 C源 文 件

中 所 有 数 据 、 模 块 、 类 的 声 明 。 当 一 个

CPP 、 C源 文 件 要 调 用 另 一 个 CPP 、 C中 所 定 义

的 模 块 功 能 时 , 需 要 包 含 那 个 CPP 、 C 文 件 对

应 的 头 文 件 。

18

Page 25: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

3. 资 源 文 件 : 包 含 了 应 用 程 序 所 使 用 的 全

部 资 源 定 义 , 通 常 以 .RC为 后 缀 名 。 注 意 这 里

说 的 资 源 不 同 与 前 面 提 到 的 资 源 , 这 里 的 资

源 是 应 用 程 序 所 能 够 使 用 的 一 类 预 定 义 工 具

中 的 一 个 对 象 , 包 括 : 字 符 串 资 源 、 加 速 键

表 、 对 话 框 、 菜 单 、 位 图 、 光 标 、 工 具 条 、

图 标 、 版 本 信 息 和 用 户 自 定 义 资 源 等 。

其 中 CPP 、 C 和 头 文 件 同 DOS 下 的 类 似 , 需 要

解 释 的 是 资 源 文 件 。 在 DOS 程 序 设 计 过 程 中 ,

所 有 的 界 面 设 计 工 作 都 在 源 程 序 中 完 成 。 而

在 Windows 程 序 设 计 过 程 中 , 象 菜 单 、 对 话 框 、

位 图 等 可 视 的 对 象 被 单 独 分 离 出 来 加 以 定 义 ,

并 存 放 在 资 源 源 文 件 中 , 然 后 由 资 源 编 译 程

序 编 译 为 应 用 程 序 所 能 使 用 的 对 象 的 映 象 。

资 源 编 译 使 应 用 程 序 可 以 读 取 对 象 的 二 进 制19

Page 26: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

映 象 和 具 体 数 据 结 构 , 这 样 可 以 减 轻 为 创 建

复 杂 对 象 所 需 要 得 程 序 设 计 工 作 。

程 序 员 在 资 源 文 件 中 定 义 应 用 程 序 所 需 使

用 的 资 源 , 资 源 编 译 程 序 编 译 这 些 资 源 并 将

它 们 存 储 于 应 用 程 序 的 可 执 行 文 件 或 动 态 连

接 库 中 。 在 Windows 应 用 程 序 中 引 入 资 源 有 以

下 一 些 好 处 :

1. 降 低 内 存 需 求 : 当 应 用 程 序 运 行 时 , 资

源 并 不 随 应 用 程 序 一 起 装 入 内 存 , 而 是 在 应

用 程 序 实 际 用 到 这 些 资 源 时 才 装 入 内 存 。 在

资 源 装 入 内 存 时 , 它 们 拥 有 自 己 的 数 据 段 ,

而 不 驻 留 于 应 用 程 序 数 据 段 中 ; 当 内 存 紧 张

时 , 可 以 废 弃 这 些 资 源 , 使 其 占 用 的 内 存 空

间 供 他 用 , 而 当 应 用 程 序 用 到 这 些 资 源 时 才

自 动 装 入 , 这 种 方 式 降 低 了 应 用 程 序 的 内 存

20

Page 27: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

需 求 , 使 一 次 可 运 行 更 多 的 程 序 , 这 也 是

Windows 内 存 管 理 的 优 点 之 一 。

2. 便 于 统 一 管 理 和 重 复 利 用 : 将 位 图 、 图

标 、 字 符 串 等 按 资 源 文 件 方 式 组 织 便 于 统 一

管 理 和 重 用 。 比 如 , 将 所 有 的 错 误 信 息 放 到

资 源 文 件 里 , 利 用 一 个 函 数 就 可 以 负 责 错 误

提 示 输 出 , 非 常 方 便 。 如 果 在 应 用 程 序 中 要

多 次 用 到 一 个 代 表 公 司 的 徽 标 位 图 , 就 可 以

将 它 存 放 在 资 源 文 件 中 , 每 次 用 到 时 再 从 资

源 文 件 中 装 入 。 这 种 方 式 比 将 位 图 放 在 一 个

外 部 文 件 更 加 简 单 有 效 。

3. 应 用 程 序 与 界 面 有 一 定 的 独 立 性 , 有 利

于 软 件 的 国 际 化 : 由 于 资 源 文 件 独 立 于 应 用

程 序 设 计 , 使 得 在 修 改 资 源 文 件 时 ( 如 调 整

对 话 框 大 小 、 对 话 框 控 制 位 置 ) , 可 以 不 修

21

Page 28: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

改 源 程 序 , 从 而 简 化 了 用 户 界 面 的 设 计 。 另

外 , 目 前 所 提 供 的 资 源 设 计 工 具 一 般 都 是 采

用 “ 所 见 即 所 得 ” 方 式 , 这 样 就 可 以 更 加 直

观 、 可 视 的 设 计 应 用 程 序 界 面 。 由 于 资 源 文

件 的 独 立 性 , 软 件 国 际 化 工 作 也 非 常 容 易 。

比 如 , 现 在 开 发 了 一 个 英 文 版 的 应 用 程 序 ,

要 想 把 它 汉 化 , 只 需 要 修 改 资 源 文 件 , 将 其

中 的 对 话 框 、 菜 单 、 字 符 串 资 源 等 汉 化 即 可 ,

而 无 需 直 接 修 改 源 程 序 。

但 是 , 应 用 程 序 资 源 只 是 定 义 了 资 源 的 外

观 和 组 织 , 而 不 是 其 功 能 特 性 。 例 如 , 编 辑

一 个 对 话 框 资 源 , 可 以 改 变 对 话 框 的 安 排 和

外 观 , 但 是 却 没 有 也 不 可 能 改 变 应 用 程 序 响

应 对 话 框 控 制 的 方 式 。 外 观 的 改 变 可 以 通 过

编 辑 资 源 来 实 现 , 而 功 能 的 改 变 却 只 能 通 过22

Page 29: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

改 变 应 用 程 序 的 源 代 码 , 然 后 重 新 编 译 来 实

现 。

Windows 应 用 程 序 的 生 成 同 DOS 下 类 似 , 也 要

经 过 编 译 、 链 接 两 个 阶 段 , 只 是 增 加 了 资 源

编 译 过 程 , 基 本 流 程 如 图 表 3-1

图表 3-1

C 、 CPP 编 译 器 将 C源 程 序 编 译 成 目 标 程 序 ,

然 后 使 用 连 接 程 序 将 所 有 的 目 标 程 序 ( 包 括

各 种 库 ) 连 接 在 一 起 , 生 成 可 执 行 程 序 。 在

制 作 Windows 应 用 程 序 时 , 编 译 器 还 要 为 引 出

函 数 生 成 正 确 的 入 口 和 出 口 代 码 。

23

Page 30: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

连 接 程 序 生 成 的 可 执 行 文 件 还 不 能 在

Windows 环 境 下 运 行 , 必 须 使 用 资 源 编 译 器 对

其 进 行 处 理 。 资 源 编 译 器 对 可 执 行 文 件 的 处

理 是 这 样 的 : 如 果 该 程 序 有 资 源 描 述 文 件 ,

它 就 把 已 编 译 为 二 进 制 数 据 的 资 源 加 入 到 可

执 行 文 件 中 ; 否 则 , 仅 对 该 可 执 行 文 件 进 行

相 容 性 标 识 。 应 用 程 序 必 需 经 过 资 源 编 译 器

处 理 才 可 以 在 Windows 环 境 下 运 行

3.2.2 事 件 驱 动 的 程 序 设 计

传 统 的 MS-DOS 程 序 主 要 采 用 顺 序 的 、 关 联 的 、

过 程 驱 动 的 程 序 设 计 方 法 。 一 个 程 序 是 一 系

列 预 先 定 义 好 的 操 作 序 列 的 组 合 , 它 具 有 一

定 的 开 头 、 中 间 过 程 和 结 束 。 程 序 直 接 控 制

程 序 事 件 和 过 程 的 顺 序 。 这 样 的 程 序 设 计 方

24

Page 31: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

法 是 面 向 程 序 而 不 是 面 向 用 户 的 , 交 互 性 差 ,

用 户 界 面 不 够 友 好 , 因 为 它 强 迫 用 户 按 照 某

种 不 可 更 改 的 模 式 进 行 工 作 。 它 的 基 本 模 型

如 图 3- 2 所 示 。

事 件 驱 动 程 序 设 计 是 一 种 全 新 的 程 序 设 计

方 法 , 它 不 是 由 事 件 的 顺 序 来 控 制 , 而 是 由

事 件 的 发 生 来 控 制 , 而 这 种 事 件 的 发 生 是 随

机 的 、 不 确 定 的 , 并 没 有 预 定 的 顺 序 , 这 样

就 允 许 程 序 的 的 用 户 用 各 种 合 理 的 顺 序 来 安

排 程 序 的 流 程 。 对 于 需 要 用 户 交 互 的 应 用 程

序 来 说 , 事 件 驱 动 的 程 序 设 计 有 着 过 程 驱 动

方 法 无 法 替 代 的 优 点 。 它 是 一 种 面 向 用 户 的

程 序 设 计 方 法 , 它 在 程 序 设 计 过 程 中 除 了 完

成 所 需 功 能 之 外 , 更 多 的 考 虑 了 用 户 可 能 的

各 种 输 入 , 并 针 对 性 的 设 计 相 应 的 处 理 程 序 。25

Page 32: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

它 是 一 种 “ 被 动 ” 式 程 序 设 计 方 法 , 程 序 开

始 运 行 时 , 处 于 等 待 用 户 输 入 事 件 状 态 , 然

后 取 得 事 件 并 作 出 相 应 反 应 , 处 理 完 毕 又 返

回 并 处 于 等 待 事 件 状 态 。 它 的 框 图 如 图 3- 3

所 示 :

图表 3-2

26

Page 33: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

图表 3-3

事 件 驱 动 围 绕 着 消 息 的 产 生 与 处 理 展 开 ,

一 条 消 息 是 关 于 发 生 的 事 件 的 消 息 。 事 件 驱

动 是 靠 消 息 循 环 机 制 来 实 现 的 。 消 息 是 一 种

报 告 有 关 事 件 发 生 的 通 知 。 消 息 类 似 于 DOS 下

的 用 户 输 入 , 但 比 DOS 的 输 入 来 源 要 广 ,

Windows 应 用 程 序 的 消 息 来 源 有 以 下 四 种 :

1 输 入 消 息 : 包 括 键 盘 和 鼠 标 的 输 入 。 这

一 类 消 息 首 先 放 在 系 统 消 息 队 列 中 , 然 后 由

Windows 将 它 们 送 入 应 用 程 序 消 息 队 列 中 , 由

应 用 程 序 来 处 理 消 息 。

27

Page 34: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

2 控 制 消 息 : 用 来 与 Windows 的 控 制 对 象 , 如

列 表 框 、 按 钮 、 检 查 框 等 进 行 双 向 通 信 。 当

用 户 在 列 表 框 中 改 动 当 前 选 择 或 改 变 了 检 查

框 的 状 态 时 发 出 此 类 消 息 。 这 类 消 息 一 般 不

经 过 应 用 程 序 消 息 队 列 , 而 是 直 接 发 送 到 控

制 对 象 上 去 。

3 系 统 消 息 : 对 程 序 化 的 事 件 或 系 统 时 钟

中 断 作 出 反 应 。 一 些 系 统 消 息 , 象 DDE 消 息

( 动 态 数 据 交 换 消 息 ) 要 通 过 Windows 的 系 统

消 息 队 列 , 而 有 的 则 不 通 过 系 统 消 息 队 列 而

直 接 送 入 应 用 程 序 的 消 息 队 列 , 如 创 建 窗 口

消 息 。

4 用 户 消 息 : 这 是 程 序 员 自 己 定 义 并 在 应

用 程 序 中 主 动 发 出 的 , 一 般 由 应 用 程 序 的 某

一 部 分 内 部 处 理 。

28

Page 35: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

在 DOS 应 用 程 序 下 , 可 以 通 过

getchar() 、 getch() 等 函 数 直 接 等 待 键 盘 输 入 , 并

直 接 向 屏 幕 输 出 。 而 在 Windows 下 , 由 于 允 许

多 个 任 务 同 时 运 行 , 应 用 程 序 的 输 入 输 出 是

由 Windows 来 统 一 管 理 的 。

Windows 操 作 系 统 包 括 三 个 内 核 基 本 元 件 :

GDI, KERNEL ,USER 。 其 中 GDI( 图 形 设 备 接 口 ) 负 责

在 屏 幕 上 绘 制 像 素 、 打 印 硬 拷 贝 输 出 , 绘 制

用 户 界 面 包 括 窗 口 、 菜 单 、 对 话 框 等 。 系 统

内 核 KERNEL 支 持 与 操 作 系 统 密 切 相 关 的 功 能 :

如 进 程 加 载 , 文 本 切 换 、 文 件 I/O , 以 及 内 存

管 理 、 线 程 管 理 等 。 USER 为 所 有 的 用 户 界 面

对 象 提 供 支 持 , 它 用 于 接 收 和 管 理 所 有 输 入

消 息 、 系 统 消 息 并 把 它 们 发 给 相 应 的 窗 口 的

消 息 队 列 。 消 息 队 列 是 一 个 系 统 定 义 的 内 存29

Page 36: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

块 , 用 于 临 时 存 储 消 息 ; 或 是 把 消 息 直 接 发

给 窗 口 过 程 。 每 个 窗 口 维 护 自 己 的 消 息 队 列 ,

并 从 中 取 出 消 息 , 利 用 窗 口 函 数 进 行 处 理 。

框 图 如 下 3- 4

图表 3-4

3.2.3 用 户 界 面 对 象 对 象 介 绍

窗 口

窗 口 是 用 户 界 面 中 最 重 要 的 部 分 。 它 是 屏

幕 上 与 一 个 应 用 程 序 相 对 应 的 矩 形 区 域 , 是

30

Page 37: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

用 户 与 产 生 该 窗 口 的 应 用 程 序 之 间 的 可 视 界

面 。 每 当 用 户 开 始 运 行 一 个 应 用 程 序 时 , 应

用 程 序 就 创 建 并 显 示 一 个 窗 口 ; 当 用 户 操 作

窗 口 中 的 对 象 时 , 程 序 会 作 出 相 应 反 应 。 用

户 通 过 关 闭 一 个 窗 口 来 终 止 一 个 程 序 的 运 行 ;

通 过 选 择 相 应 的 应 用 程 序 窗 口 来 选 择 相 应 的

应 用 程 序 。 一 个 典 型 的 窗 口 外 观 如 图 3- 5 所

示 。

图表 3-5

边 框31

Page 38: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

绝 大 多 数 窗 口 都 有 一 个 边 框 , 用 于 指 示 窗

口 的 边 界 。 同 时 也 用 来 指 明 该 窗 口 是 否 为 活

动 窗 口 , 当 窗 口 活 动 时 , 边 框 的 标 题 栏 部 分

呈 高 亮 显 示 。 用 户 可 以 用 鼠 标 拖 动 边 框 来 调

整 窗 口 的 大 小 。

系 统 菜 单 框

系 统 菜 单 框 位 于 窗 口 左 上 角 , 以 当 前 窗 口

的 图 标 方 式 显 示 , 用 鼠 标 点 一 下 该 图 标 ( 或

按 ALT+ 空 格 键 ) 就 弹 出 系 统 菜 单 。 系 统 菜 单

提 供 标 准 的 应 用 程 序 选 项 , 包 括 : Restore(还 原

窗 口 原 有 的 大 小 ) , Move( 使 窗 口 可 以 通 过 键 盘

上 的 光 标 键 来 移 动 其 位 置 ) , Size( 使 用 光 标 键

调 整 窗 口 大 小 ) , Minimize( 将 窗 口 缩 成 图 标 ) ,

Maximize(最 大 化 : 使 窗 口 充 满 整 个 屏 幕 ) 和

Close( 关 闭 窗 口 ) 。

32

Page 39: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

标 题 栏

标 题 栏 位 于 窗 口 的 顶 部 , 其 中 显 示 的 文 本

信 息 用 于 标 注 应 用 程 序 , 一 般 是 应 用 程 序 的

名 字 , 以 便 让 用 户 了 解 哪 个 应 用 程 序 正 在 运

行 。 标 题 栏 颜 色 反 映 该 窗 口 是 否 是 一 个 活 动

窗 口 , 当 为 活 动 窗 口 时 , 标 题 栏 呈 现 醒 目 颜

色 。 鼠 标 双 击 标 题 栏 可 以 使 窗 口 在 正 常 大 小

和 最 大 化 状 态 之 间 切 换 。 在 标 题 栏 上 按 下 鼠

标 器 左 键 可 以 拖 动 并 移 动 该 窗 口 , 按 右 键 弹

出 窗 口 系 统 菜 单

菜 单 栏

菜 单 栏 位 于 标 题 栏 下 方 , 横 跨 屏 幕 , 在 它

上 面 列 出 了 应 用 程 序 所 支 持 的 命 令 , 菜 单 栏

中 的 项 是 命 令 的 主 要 分 类 , 如 文 件 操 作 、 编

33

Page 40: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

辑 操 作 。 从 菜 单 栏 中 选 中 某 一 项 通 常 会 显 示

一 个 弹 出 菜 单 , 其 中 的 项 是 对 应 于 指 定 分 类

中 的 某 个 任 务 。 通 过 选 择 菜 单 中 的 一 个 项

( 菜 单 项 ) , 用 户 可 以 向 程 序 发 出 命 令 , 以

执 行 某 一 功 能 。 如 选 择 “ 文 件 -> 打 开 ...”菜 单

项 会 弹 出 一 个 打 开 文 件 对 话 框 , 让 用 户 选 择

一 个 文 件 , 然 后 打 开 这 个 文 件 。

一 般 的 , 以 “ ...”结 尾 的 菜 单 项 文 本 表 明 选

择 该 项 时 会 弹 出 一 个 对 话 框 , 让 用 户 输 入 信

息 , 然 后 执 行 操 作 , 如 “ 文 件 -> 打 开 ...” 。 若

不 以 “ ...”结 尾 , 则 表 明 选 择 该 菜 单 项 直 接 执

行 一 个 动 作 , 如 “ 编 辑 ” 菜 单 下 的 “ 粘 贴 ”

菜 单 项 。 若 一 个 菜 单 项 呈 现 灰 色 , 则 表 明 该

菜 单 当 前 不 可 用 。 有 时 菜 单 项 上 还 有 加 速 键 ,

加 速 键 是 一 种 键 盘 组 合 , 它 是 菜 单 项 的 一 种34

Page 41: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

替 代 方 式 , 可 以 让 用 户 通 过 键 盘 直 接 发 出 命

令 ; 在 键 盘 上 按 下 这 一 键 盘 组 合 , 就 等 效 于

选 择 了 相 应 的 菜 单 。 如 “ 粘 贴 ( P )

CTRL+V” , 就 表 示 粘 贴 操 作 的 加 速 键 是 CTRL+V ,

按 下 CTRL+V 就 执 行 粘 贴 操 作 。

客 户 区

客 户 区 是 窗 口 中 最 大 的 一 块 空 白 矩 形 区 域 ,

用 于 显 示 应 用 程 序 的 输 出 。 例 如 , 字 处 理 程

序 在 客 户 区 中 显 示 文 档 的 当 前 页 面 。 应 用 程

序 负 责 客 户 区 的 绘 制 工 作 , 而 且 只 有 和 该 窗

口 相 对 应 的 应 用 程 序 才 能 向 该 用 户 区 输 出

垂 直 滚 动 条 和 水 平 滚 动 条

垂 直 滚 动 条 和 水 平 滚 动 条 分 别 位 于 客 户 区

的 左 侧 和 底 部 , 它 们 各 有 两 个 方 向 相 反 的 箭

头 和 一 个 深 色 的 长 度 可 变 的 滚 动 块 。 可 以 用

35

Page 42: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

鼠 标 选 中 滚 动 条 的 箭 头 上 下 卷 滚 ( 选 中 垂 直

滚 动 条 时 ) 或 水 平 卷 滚 ( 选 中 水 平 滚 动 条

时 ) 客 户 区 的 内 容 。 滚 动 块 的 位 置 表 示 客 户

区 中 显 示 的 内 容 相 对 于 要 显 示 的 全 部 内 容 的

位 置 , 滚 动 块 的 长 度 表 示 客 户 区 中 显 示 的 内

容 大 小 相 对 于 全 部 内 容 大 小 的 比 例

对 话 框

对 话 框 是 一 种 特 殊 的 窗 口 , 它 提 供 了 一 种

接 收 用 户 输 入 、 处 理 数 据 的 标 准 方 法 。 特 别

的 , 当 用 户 输 入 了 一 个 需 要 附 加 信 息 的 命 令

时 , 对 话 框 是 接 收 输 入 的 标 准 方 法 。 比 如 ,

假 设 用 户 要 求 系 统 打 开 一 个 文 件 , 对 话 框 就

可 以 提 供 一 个 让 用 户 从 一 组 文 件 中 选 择 一 个

文 件 的 标 准 方 法 。 如 前 所 述 , 在 一 般 情 况 下 ,

在 选 择 菜 单 名 字 后 面 跟 着 省 略 号 ( ... ) 的 菜

36

Page 43: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

单 项 通 常 会 弹 出 一 个 对 话 框 。 图 3- 6 给 出 了

查 找 对 话 框 的 一 个 例 子

图表 3-6

3.3网 络 通 信 设 计

服务器端的网络模块负责监听客服端的连接,负责接收并处理客户端发送过来的命令(鼠标,键盘,网络消息等命令),在本机上处理这些消息并发送各种数据(屏幕数据,命令返回数据)到客户端监听程序。客服端网络模块负责连接到服务器端的监听 SOCKET,负责向服务器端发送各种操作命令(鼠标,键盘,各种通用消息参数命令等),负责接收从服务器端发过来的数据(屏幕数据,命令执行结果等),并对这些数据进行解压解码,然后将这些数据的内容显示到屏幕上。其中采用的是流式套接字,他是基于 TCP 通信原理而封装的。是面向连接的服务,提供了更高的安全性。

通 常 情 况 下 , 一 个 协 议 提 供 面 向 连 接 的 服务 , 或 提 供 无 连 接 的 服 务 。 面 向 连 接 的 服 务中 , 进 行 数 据 交 换 之 前 , 必 须 与 通 信 方 建 立一 条 路 径 。 这 样 既 确 定 了 通 信 方 之 间 存 在 路

37

Page 44: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

由 , 又 保 证 了 通 信 双 方 都 是 活 动 的 、 都 可 彼此 响 应 , 但 其 特 点 是 在 通 信 双 方 之 间 建 立 一个 通 信 信 道 需 要 很 多 开 支 。 除 此 以 外 , 大 部分 面 向 连 接 的 协 议 为 保 证 投 递 无 误 , 可 能 会因 为 执 行 额 外 的 计 算 来 验 证 正 确 性 , 因 此 ,进 一 步 增 加 开 支 。 而 无 连 接 协 议 却 不 保 证 接收 端 是 否 正 在 收 听 。 无 连 接 服 务 类 似 于 邮 政服 务 : 发 信 人 把 信 装 入 邮 箱 即 可 。 至 于 收 信人 是 否 想 收 到 这 封 信 或 邮 局 是 否 会 因 为 暴 风雨 未 能 按 时 将 信 件 投 递 到 收 信 人 处 等 等 , 发信 人 都 不 得 而 知 。

在 断 开 连 接 的 过 程 中 , TCP 使 用 从 容 关 闭 。从 容 关 闭 只 出 现 在 面 向 连 接 的 协 议 中 。 在 这种 关 闭 过 程 中 , 一 方 开 始 关 闭 通 信 会 话 , 但另 一 方 仍 然 可 以 读 取 线 上 或 网 络 堆 栈 上 已 挂起 的 数 据 。 如 果 面 向 连 接 的 协 议 不 支 持 从 容关 闭 , 只 要 其 中 一 方 关 闭 了 通 信 信 道 , 都 会导 致 连 接 立 即 中 断 , 数 据 丢 失 , 接 收 端 不 能读 取 数 据 这 些 情 况 出 现 。 使 用 T C P协 议 , 连 接双 方 都 必 须 执 行 一 次 关 闭 , 以 便 完 全 中 断 连接 。 发 起 方 向 另 一 个 通 信 方 发 出 一 个 带 有 F I N

控 制 标 志 的 分 段 ( 数 据 报 ) 。 接 收 端 的 通 信38

Page 45: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

方 则 向 发 起 方 返 回 一 个 A C K控 制 标 志 , 确 认 收到 F I N , 但 此 时 发 起 方 仍 然 可 发 送 数 据 。 F I N

控 制 标 志 表 示 发 起 关 闭 的 这 一 方 不 再 发 送 数据 。 一 旦 通 信 方 决 定 不 需 要 发 送 数 据 , 它 就会 发 出 一 个 F I N 控 制 标 志 , 并 带 有 发 起 方 确 认的 A C K控 制 标 志 。 这 时 , 该 连 接 已 完 全 关 闭 。

3.3.1 面 向 消 息 的 通 信 方 式 简 介

对 每 个 离 散 写 命 令 来 说 , 如 果 传 送 协 议 把

它 们 ( 而 且 只 有 它 们 ) 当 做 一 条 独 立 的 消 息

在 网 上 传 送 , 我 们 就 说 该 协 议 是 面 向 协 议 的 。

同 时 , 还 意 味 着 接 收 端 在 接 收 数 据 时 , 返 回

的 数 据 是 发 送 端 写 入 的 一 条 离 散 消 息 。 接 收

端 不 能 得 到 更 多 的 消 息 , 仅 此 而 已 。 比 如 ,

图 3 - 2 中 , 左 边 的 工 作 站 向 右 边 的 工 作 站 提

交 了 三 条 分 别 是 1 2 8 、 6 4 和 3 2 字 节 的 消 息 。 作

为 接 收 端 的 工 作 站 发 出 三 条 读 取 命 令 , 缓 冲

39

Page 46: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

区 是 2 5 6 个 字 节 。 后 来 的 各 次 调 用 返 回 的 分 别

是 1 2 8 、 6 4 � 和 3 2 个 字

图表 3-7

无 保 护 消 息 边 界 的 协 议 通 常 称 作 “ 基 于 流

的 协 议 ” 。 大 家 要 知 道 “ 基 于 流 的 协 议 ” 这

一 术 语 常 用 来 指 代 附 加 特 性 。 流 服 务 的 定 义

是 连 续 的 数 据 传 输 ; 不 管 消 息 边 界 是 否 存 在 ,

接 收 端 都 会 尽 量 地 读 取 有 效 数 据 。 对 发 送 端

来 说 , 意 味 着 允 许 系 统 将 原 始 消 息 分 解 成 小

消 息 或 把 几 条 消 息 积 累 在 一 起 , 形 成 一 个 较

40

Page 47: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

大 的 数 据 包 。 对 接 收 端 来 说 , 则 是 数 据 一 到

达 网 络 堆 栈 ,

网 络 堆 栈 就 开 始 读 取 它 , 并 将 它 缓 存 下 来

等 候 进 程 处 理 。 在 进 程 请 求 处 理 大 量 数 据 时 ,

系 统 会 在 不 溢 出 为 客 户 请 求 提 供 的 缓 冲 区 这

一 前 提 下 , 尽 量 返 回 更 多 的 数 据 。 在 Error:

Reference source not found中 , 发 送 端 提 交 了 三 个 数

据 包 : 分 别 是 1 2 8、 6 4 和 3 2 个 字 节 ; 但 是 , 本

地 系 统 堆 栈 自 由 地 把 这 些 数 据 聚 合 在 一 起 ,

形 成 一 个 大 的 数 据 包 。 这 种 情 况 下 , 重 组 后

的 2 个 数 据 包 就 会 一 起 传 输 。 是 否 将 各 个 独 立

的 数 据 包 累 积 在 一 起 受 许 多 因 素 的 影 响 , 比

如 最 大 传 输 单 元 或 N a g l e 算 法 。 在 T C P / I P 中 ,

在 将 积 累 起 来 的 数 据 发 到 线 上 之 前 , N a g l e

算 法 在 等 候 数 据 积 累 的 主 机 中 进 行 。 在 需 要41

Page 48: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

发 送 的 数 据 积 累 到 一 定 数 量 或 预 定 时 间 已 超

过 之 前 , 这 个 主 机 会 一 直 等 下 去 。 实 施

N a g l e 算 法 时 , 主 机 的 通 信 方 在 发 送 主 机 确

认 之 前 , 会 等 一 等 外 出 数 据 , 主 机 的 通 信 方

就 不 必 发 送 一 个 只 有 确 认 的 数 据 包 。 发 送 小

数 据 包 不 仅 没 有 多 少 意 义 , 而 且 还 会 徒 增 错

误 检 查 和 确 认 , 相 当 烦 人 。 在 接 收 端 , 网 络

堆 栈 把 所 有 进 来 的 数 据 包 聚 集 在 一 起 , 归 入

既 定 进 程 。 我 们 来 看 看 Error: Reference source not

found 。

如 果 接 收 端 执 行 一 次 2 5 6字 节 缓 冲 区 的 读 取 ,

系 统 马 上 就 会 返 回 2 2 4个 字 节 。 如 果 接 收 端 只

要 求 读 取 2 0 个 字 节 , 系 统 就 会 只 返 回 2 0 个 字

42

Page 49: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

图表 3-8

3.3.2 可 靠 性 和 次 序 性

在 设 计 用 于 特 定 协 议 的 应 用 程 序 来 说 , 可

靠 性 和 次 序 性 是 我 们 必 须 了 解 的 最 具 决 定 性

的 特 性 。 大 多 数 情 况 下 , 可 靠 性 和 次 序 性 与

协 议 是 无 连 接 的 , 还 是 面 向 连 接 的 密 切 相 关 。

可 靠 性 ( 或 保 证 投 递 ) 保 证 了 发 送 端 发 出 的

每 个 字 节 都 能 到 达 既 定 的 接 收 端 。 不 具 备 可

靠 性 的 协 议 则 不 能 保 证 每 个 字 节 都 能 到 达 接

收 端 , 同 样 不 能 保 证 数 据 的 完 整 性 。

43

Page 50: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

次 序 性 是 指 对 数 据 到 达 接 收 端 的 顺 序 进 行

处 理 。 保 护 次 序 性 的 协 议 保 证 接 收 端 收 到 数

据 的 顺 序 就 是 数 据 的 发 送 顺 序 。 显 然 , 没 有

保 护 次 序 性 的 协 议 就 没 有 次 序 保 证 。 在 面 向

连 接 的 通 信 中 , 如 果 你 一 直 试 图 在 通 信 双 方

建 立 一 个 显 式 通 信 信 道 , 一 般 希 望 协 议 能 够

保 证 数 据 的 完 整 性 和 次 序 性 。 多 数 情 况 下 ,

面 向 连 接 的 协 议 的 确 能 保 证 数 据 的 可 靠 性 。

可 靠 性 和 次 序 性 两 者 不 能 兼 而 得 之 , 保 证

了 数 据 包 顺 序 , 就 不 能 自 动 保 证 数 据 的 完 整

性 。 当 然 , 无 连 接 协 议 的 过 人 之 处 就 是 速 度 :

对 接 入 接 收 端 的 虚 拟 连 接 来 说 , 它 们 不 会 影

响 其 建 立 。 为 什 么 这 样 反 而 降 低 了 错 误 检 查

的 速 度 呢 ? 原 来 这 便 是 无 连 接 协 议 一 般 不 保

证 数 据 完 整 性 和 次 序 性 , 而 面 向 连 接 的 协 议44

Page 51: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

却 能 做 到 的 原 因 。 数 据 报 如 此 不 完 善 , 为 什

么 大 家 都 喜 欢 用 它 呢 ? 原 来 , 无 连 接 协 议 按

数 量 大 小 排 序 , 比 面 向 连 接 的 通 信 快 得 多 。

另 外 , 它 不 必 去 验 证 数 据 完 整 性 和 数 据 收 到

确 认 与 否 和 发 送 小 量 数 据 时 增 加 的 复 杂 性 等

等 。 对 非 临 界 的 数 据 传 输 来 说 , 数 据 报 非 常

有 用 。 而 前 面 讨 论 过 的 网 络 游 戏 示 例 之 类 的

应 用 , 数 据 报 简 直 是 为 它 们 量 身 定 做 的 : 每

个 玩 家 都 可 利 用 数 据 报 周 期 性 地 向 别 的 玩 家

发 送 他 / 她 在 游 戏 中 的 位 置 。 如 果 某 一 个 客

户 机 丢 失 了 一 个 数 据 包 , 很 快 就 能 收 到 另 外

一 个 , 像 无 缝 通 信 一 样 方 便 .

这 次 程 序 设 计 采 用 的 是 TCP 连 接 , 保 证 了 以

上 两 点 的 要 求 。

45

Page 52: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

3.3.3 TCP 的 从 容 关 闭

从 容 关 闭 只 出 现 在 面 向 连 接 的 协 议 中 。 在

这 种 关 闭 过 程 中 , 一 方 开 始 关 闭 通 信 会 话 ,

但 另 一 方 仍 然 可 以 读 取 线 上 或 网 络 堆 栈 上 已

挂 起 的 数 据 。 如 果 面 向 连 接 的 协 议 不 支 持 从

容 关 闭 , 只 要 其 中 一 方 关 闭 了 通 信 信 道 , 都

会 导 致 连 接 立 即 中 断 , 数 据 丢 失 , 接 收 端 不

能 读 取 数 据 这 些 情 况 出 现 。 如 果 使 用 T C P协 议 ,

连 接 双 方 都 必 须 执 行 一 次 关 闭 , 以 便 完 全 中

断 连 接 。 发 起 方 向 另 一 个 通 信 方 发 出 一 个 带

有 F I N 控 制 标 志 的 分 段 ( 数 据 报 ) 。 接 收 端 的

通 信 方 则 向 发 起 方 返 回 一 个 A C K 控 制 标 志 ,

确 认 收 到 F I N , 但 此 时 发 起 方 仍 然 可 发 送 数 据 。

F I N 控 制 标 志 表 示 发 起 关 闭 的 这 一 方 不 再 发 送

46

Page 53: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

数 据 。 一 旦 通 信 方 决 定 不 需 要 发 送 数 据 , 它

就 会 发 出 一 个 F I N 控 制 标 志 , 并 带 有 发 起 方 确

认 的 A C K 控 制 标 志 。 这 时 , 该 连 接 已 完 全 关

闭 。

这 样 在 用 户 断 开 操 作 时 协 议 自 动 帮 助 我 们

安 全 的 保 证 数 据 流 不 会 丢 失 的 清 理 掉 环 境 。

3.3.4 OOP 简 介

面向对象编程 (Object Oriented Programming ,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件:

组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在

OOP 计算机程序中是模块和结构化的基础。

抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。

封装 - 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。

多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。

47

Page 54: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。

3.3.5 服 务 器 端 要 使 用 的 API

1 WSAEnumprotocol

用 来 获 得 系 统 中 安 装 协 议 的 相 关 信 息 。2 WSAStartup

在可以调用一个Wi n s o c k函数之前,必须先加载一个版本正确的Wi n s o

c k库。int WSAStartup(WORD wVe r s i o n R e q u e s t e d , L P W S A D ATA

lpWSAData)第一个参数是准备加载的Wi n s o c k库的版本号。就目前的Wi n 3 2

平台而言,Winsock 2库的最新版本是2 . 2。唯一的例外是Windows CE,它只支持Winsock 1.1版。如果需要Winsock 2.2版,指定这个值( 0 x 0 2 0 2)或使用宏M A K E W O R D ( 2 , 2 )即可。高位字节指定副版本,而低位字节则指定主版本。第二个参数是W S A D ATA结构,它是调用完成之后立即返回的。W

S A D ATA包含了W S A S t a r t u p加载的关于Wi n s o c k版本的信息。3 WSACleanup

在 结 束 Wi n s o c k 库 , 而 且 不 再 需 要 调 用 任 何Wi n s o c k 函 数 时 , 附 带 例 程 会 卸 载 这 个 库 , 并释 放 资 源

4 WSASocket

SOCKET WSASocket( int af,int type,iprotocol,LPWSAPROTOCOL,GROUP

G,DWORD dwflags); 第一个参数a f,是协议的地址家族。比如,如果想建立一个U D P或T C P套接字,可用常量A F _ I N E T来指代互联网协议( I P)。第二个参数t y p e,是协议的套接字类型。套接字的类型可以是下面五个值: S O

C K _ S T R E A M、S O C K _ D G R A M、S O C K _ S E Q PA C K E T、S O C

48

Page 55: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

K _ R AW和S O C K _ R D M。第三个参数是p r o t o c o l。指定的地址家族和套接字类型有多个条目时,就可用这个字段来限定使用特定传输, 利用W S A S o

c k e t建立套接字时,可向函数调用传送一个W S A P R O TO C O L _ I N F O

结构,以定义准备建立的那个套接字的类型;尽管如此,还是可建立一些套接字类型(在传输提供者目录中,它们没有相应的条目)。最佳示例是I P协议下的原始套接字。原始套接字一种通信,允许你把其他协议封装在U D P数据包中.

5 S O C K A D D R _ I N

服务器打算监听接入客户机请求时,也必须指定一个I P地址和一个端口号 。Wi n s o c k中,应用通过S O C K A D D R _ I N结构来指定I P地址和服务端口信息 Struct sockaddr_in

{

Short sin_family;

U_short sin_port;

Struct in_addr sin_addr;

Char sin_zero[8];

};

s i n _ f a m i l y字段必须设为A F _ I N E T,以告知Wi n s o c k我们此时正在使用I P地址家族. 准备使用哪个T C P或U D P通信端口来标识服务器服务这一问题,则由s i n _ p o r t字段定义. S O C K A D D R _ I N结构的s i n _

a d d r字段用于把一个I P地址保存为一个4字节的数,它是无符号长整数类型。根据这个字段的不同用法,还可表示一个本地或远程I P地址。I P地址一般是用“互联网标准点分表示法”(像a . b . c . d一样)指定的,每个字母代表一个字节数,从左到右分配一个4字节的无符号长整数. 最后一个字段sin_ zero ,只充当填充项的职责,以使S O C K A D D R _ I N结构和S O C K A D D R结构的长度一样.

6 bind

一 旦 为 某 种 特 定 协 议 创 建 了 套 接 字 , 就 必须 将 套 接 字 绑 定 到 一 个 已 知 地 址 。 b i n d函 数 可

49

Page 56: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

将 指 定 的 套 接 字 同 一 个 已 知 地 址 绑 定 到 一 起 。该 函 数 声 明 如 下 :

Int bind( SOCKET s, Const struct sockaddr FAR *name Int namelen )

其 中 , 第 一 个 参 数 s 代 表 我 们 希 望 在 上 面 等待 客 户 机 连 接 的 那 个 套 接 字 。 第 二 个 参 数 的类 型 是 struct sockaddr, 它 的 作 用 很 简 单 , 就 是 一 个普 通 的 缓 冲 区 。 针 对 自 己 打 算 使 用 的 那 个 协议 , 必 须 把 该 参 数 实 际 地 填 充 一 个 地 址 缓 冲区 , 并 在 调 用 b i n d时 将 其 造 型 为 一 个 s t r u c ts o c k a

d d r 。 为 简 化 起 见 , 本 章 都 将 使 用 这 个 类 型 。第 三 个 参 数 代 表 要 传 递 的 、 由 协 议 决 定 的 地址 的 长 度 。 7 listen

我 们 接 下 来 要 做 的 是 将 套 接 字 置 入 监 听 模式 。 b i n d函 数 的 作 用 只 是 将 一 个 套 接 字 和 一 个指 定 的 地 址 关 联 在 一 起 。 指 示 一 个 套 接 字 等候 进 入 连 接 的 A P I 函 数 则 是 l i s t e n.

Int listen ( SOCKET s, Int backlog )

第 一 个 参 数 同 样 是 限 定 套 接 字 。 b a c k l o g 参数 指 定 了 正 在 等 待 连 接 的 最 大 队 列 长 度 。 这

50

Page 57: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

个 参 数 非 常 重 要 , 因 为 完 全 可 能 同 时 出 现 几个 服 务 器 连 接 请 求 。 例 如 , 假 定 b a c k l o g 参 数为 2 。 如果 三 个 客 户 机 同 时 发 出 请 求 , 那 么 头 两 个 会被 放 在 一 个 “ 待 决 ” ( 等 待 处 理 ) 队 列 中 ,以 便 应用 程 序 依 次 为 它 们 提 供 服 务 。 而 第 三 个 连 接会 造 成 一 个 W S A E C O N N R E F U S E D 错 误 。 注 意 ,一 旦 服 务 器 接 受 了 一 个 连 接 , 那 个 连 接 请 求就 会 从 队 列 中 删 去 , 以 便 别 人 可 继 续 发 出 请求

8 accept

同 意 连 接 客 服 端 的 函 数 。SOCKET accept( SOCKET s, Struct sockaddr FAR*addr Int FAR * addrlen)

其 中 , 参 数 s 是 一 个 限 定 套 接 字 , 它 处 在监 听 模 式 。 第 二 个 参 数 应 该 是 一 个 有 效 的 S O C

K A D D R _ I N结 构 的 地 址 , 而 a d d r l e n 应 该 是 S O C K

A D D R _ I N结 构 的 长 度 。 对 于 属 于 另 一 种 协 议 的套 接 字 , 应 当 用 与 那 种 协 议 对 应 的 S O C K A D D R

结 构 来 替 换 S O C K A D D R _ I N。 通 过 对 a c c p e t 函 数的 调 用 , 可 为 待 决 连 接 队 列 中 的 第 一 个 连 接

51

Page 58: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

请 求 提 供 服 务 。 a c c e p t 函 数 返 回 后 , a d d r结 构中 会 包 含 发 出 连 接 请 求 的 那 个 客 户 机 的 I P 地址 信 息 , 而 a d d r l e n 参 数 则 指 出 结 构 的 长 度 。此 外 , a c c e p t 会 返 回 一 个 新 的 套 接 字 描 述 符 ,它 对 应 于 已 经 接 受 的 那 个 客 户 机 连 接 。 对 于该 客 户 机 后 续 的 所 有 操 作 , 都 应 使 用 这 个 新套 接 字 。 至 于 原 来 那 个 监 听 套 接 字 , 它 仍 然用 于 接 受 其 他 客 户 机 连 接 , 而 且 仍 处 于 监 听模 .

3.3.6 客 服 端 要 使 用 的 API

1 c o n n e c t

用 于 连 接 服 务 器 端 的 套 接 字 的 函 数 。Int connect(

SOCKET S,Const struct sockaddr FAR*name,Int namelen)

s 是 要 通 信 建 立 连 接 的 那 个 有 效 T C P 套 接 字 ; n a m e 是 针 对 T C P ( 说 明 连 接 的 服 务 器 ) 的 套接 字 地 址 结 构 ( S O C K A D D R _ I N) ; n a m e l e n 则是 名 字 参 数 的 长 度2 send

在 已 建 立 连 接 的 套 接 字 上 发 送 数 据

52

Page 59: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

Int send( SOCKET S, Const char FAR *buf, Int len, Int flags);

S O C K E T参 数 是 已 建 立 连 接 的 套 接 字 , 将 在这 个 套 接 字 上 发 送 数 据 。 第 二 个 参 数 b u f , 则是 字 符 缓 冲 区 , 区 内 包 含 即 将 发 送 的 数 据 。第 三 个 参 数 l e n, 指 定 即 将 发 送 的 缓 冲 区 内 的字 符 数3 recv

已 连 接 套 接 字 上 接 受 接 入 数 据Int recv( SOCKET s, Char FAR*buf, Int len, Int flags);

第 一 个 参 数 s , 是 准 备 接 收 数 据 的 那 个 套 接 字 。第 二 个 参 数 b u f , 是 即 将 收 到 数 据 的 字 符 缓 冲 ,而 l e n则 是 准 备 接 收 的 字 节 数 或 b u f 缓 冲 的 长 度 .

3.3.7 建 立 连 接 的 过 程 图

服 务 器 端 客 服 端建 立 SOCKET 建 立 SOCKET

绑 定

53

Page 60: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

监 听

接 受 链 接 连 接

基 于 数 据 流 的 套 接 字 的 工 作 过 程 是 完 全 依

赖 于 协 议 TCP 的 , 并 具 有 差 控 和 流 控 , 所 以 一

旦 连 接 建 立 成 功 , 数 据 流 是 能 够 被 保 证 的

3.3.8 服 务 器 连 接 代 码 分 析

DWORD WINAPI LoadWinsock(LPVOID lpParam){

LPBYTE pBuf;WSAPROTOCOL_INFO Protocol;int nRet;int nZero = 0;

54

Page 61: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

int iAddrSize;HANDLE hThread;DWORD dwThreadId;char szClientIP[81];char szString[255];struct sockaddr_in local,client;struct myStruct myStructure;

dwLen = 0;nRet = WSAEnumProtocols(NULL,NULL,&dwLen);if (nRet == SOCKET_ERROR){

if (WSAGetLastError() != WSAENOBUFS)return 1;

}pBuf = malloc(dwLen);// 为WSASocketGet()nRet = SelectProtocols(SETFLAGS,NOTSETFLAGS,

(LPWSAPROTOCOL_INFO)pBuf,&dwLen,&Protocol);

Listen = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM);

if (Listen == SOCKET_ERROR){

sprintf(szString,"socket() failed: %d",WSAGetLastError());MessageBox(NULL,szString,"Remote Server",MB_OK);return 1;

}

local.sin_addr.s_addr = htonl(INADDR_ANY);local.sin_family = AF_INET;local.sin_port = htons(gPort);

if (bind(Listen,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR){

sprintf(szString,"bind() failed: %d\n", WSAGetLastError());MessageBox(NULL,szString,"Remote Server",MB_OK);return 1;

}

55

Page 62: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

listen(Listen,SOMAXCONN);这也就是一个套接字的建立,绑定,监听,最后到接受连接的过程,3.3.9 客 服 端 代 码 连 接 分 析

int LoadWinsock(HWND hWnd,char *szIP){

WSADATA wsd;DWORD dwLen;int nRet,nZero;LPBYTE pBuf;WSAPROTOCOL_INFO Protocol;char szString[81];char szMessage[81];

if (WSAStartup(0x202,&wsd) != 0){

MessageBox(NULL,"hehe","Client Socket Error",MB_OK);return 1;

}

dwLen = 0;nRet = WSAEnumProtocols(NULL,NULL,&dwLen);if (nRet == SOCKET_ERROR){

if (WSAGetLastError() != WSAENOBUFS)return 1;

}

pBuf = malloc(dwLen);

nRet = SelectProtocols(SETFLAGS,NOTSETFLAGS,(LPWSAPROTOCOL_INFO)pBuf,&dwLen,&Protocol);

free(pBuf);

sClient = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM);

if (sClient == INVALID_SOCKET)return 1;

56

Page 63: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

nZero = 0;setsockopt(sClient,SOL_SOCKET,SO_RCVBUF,(char *)&nZero,sizeof(nZero));

server.sin_family = AF_INET;server.sin_port = htons(port);server.sin_addr.s_addr = inet_addr(szIP);

if (connect(sClient,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR){

memset(szString,'\0',sizeof(szString));sprintf(szString,"Connect() failed: %d",WSAGetLastError());MessageBox(NULL,szString,"Client Socket Error",MB_OK);return 1;

}

客 户 端 代 码 流 程 就 相 对 于 简 单 明 了 一 些 ,

我 们 只 需 要 建 立 一 个 套 截 字 , 然 后 与 服 务 器

去 做 连 接 , 最 后 等 待 返 回 就 行 了 。

3.4 进 程 与 线 程

在 服 务 器 端 ACCEPT 接 收 连 接 并 建 立 传 输 套接 字 过 后 , 服 务 器 端 主 线 程 会 重 新 派 生 出 一个 新 的 服 务 子 线 程 来 满 足 客 户 连 接 需 求 。 下面 我 们 来 理 清 WINDOWS 下 线 程 和 进 程 的 区 别 和他 们 是 怎 么 样 协 同 工 作 的 。

进 程 是 不 活 泼 的 。 要 使 进 程 完 成 某 项 操 作 ,它 必 须 拥 有 一 个 在 它 的 环 境 中 运 行 的 线 程 ,该 线 程 负 责 执 行 包 含 在 进 程 的 地 址 空 间 中 的

57

Page 64: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

代 码 。 实 际 上 , 单 个 进 程 可 能 包 含 若 干 个 线程 , 所 有 这 些 线 程 都 “ 同 时 ” 执 行 进 程 地 址空 间 中 的 代 码 。 为 此 , 每 个 线 程 都 有 它 自 己的 一 组 C P U寄 存 器 和 它 自 己 的 堆 栈 。 每 个 进 程至 少 拥 有 一 个 线 程 , 来 执 行 进 程 的 地 址 空 间中 的 代 码 。 如 果 没 有 线 程 来 执 行 进 程 的 地 址空 间 中 的 代 码 , 那 么 进 程 就 没 有 存 在 的 理 由了 , 系 统 就 将 自 动 撤 消 该 进 程 和 它 的 地 址 空间 。 若 要 使 所 有 这 些 线 程 都 能 运 行 , 操 作 系统 就 要 为 每 个 线 程 安 排 一 定 的 C P U 时 间 。 它 通过 以 一 种 循 环 方 式 为 线 程 提 供 时 间 片 ( 称 为量 程 ) , 造 成 一 种 假 象 , 仿 佛 所 有 线 程 都 是同 时 运 行 的 一 样 当 创 建 一 个 进 程 时 , 系 统 会自 动 创 建 它 的 第 一 个 线 程 , 称 为 主 线 程 。 然后 , 该 线 程 可 以 创 建 其 他 的 线 程 , 而 这 些 线程 又 能 创 建 更 多 的 线 程 。

进 程 从 来 不 执 行 任 何 东 西 , 它 只 是 线 程 的容 器 。 线 程 总 是 在 某 个 进 程 环 境 中 创 建 的 ,而 且 它 的 整 个 寿 命 期 都 在 该 进 程 中 。 这 意 味着 线 程 在 它 的 进 程 地 址 空 间 中 执 行 代 码 , 并且 在 进 程 的 地 址 空 间 中 对 数 据 进 行 操 作 。 因此 , 如 果 在 单 进 程 环 境 中 , 你 有 两 个 或 多 个

58

Page 65: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

线 程 正 在 运 行 , 那 么 这 两 个 线 程 将 共 享 单 个地 址 空 间 。 这 些 线 程 能 够 执 行 相 同 的 代 码 ,对 相 同 的 数 据 进 行 操 作 。 这 些 线 程 还 能 共 享内 核 对 象 句 柄 , 因 为 句 柄 表 依 赖 于 每 个 进 程而 不 是 每 个 线 程 存 在 。 进 程 使 用 的 系 统 资 源比 线 程 多 得 多 , 原 因 是 它 需 要 更 多 的 地 址 空间 。 为 进 程 创 建 一 个 虚 拟 地 址 空 间 需 要 许 多系 统 资 源 。 系 统 中 要 保 留 大 量 的 记 录 , 这 要占 用 大 量 的 内 存 。 另 外 , 由 于 . e x e 和 . d l l 文 件要 加 载 到 一 个 地 址 空 间 , 因 此 也 需 要 文 件 资源 。 而 线 程 使 用 的 系 统 资 源 要 少 得 多 。 实 际上 , 线 程 只 有 一 个 内 核 对 象 和 一 个 堆 栈 , 保留 的 记 录 很 少 , 因 此 需 要 很 少 的 内 存

3.4.1 创 建 线 程 所 使 用 的 API

HANDLE CreateThread( PSECURITY_ATTRIBUTES psa, DWORD cbStack, PTHREAD_START_ROUTINE pfnstartaddr, PVOID pvPraram, DWORD fdwCreate, PDWORD pdwThreadID)

当 C r e a t e T h r e a d 被 调 用 时 , 系 统 创 建 一 个 线程 内 核 对 象 。 该 线 程 内 核 对 象 不 是 线 程 本 身 ,

59

Page 66: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

而 是 操 作 系 统 用 来 管 理 线 程 的 较 小 的 数 据 结构 。 可 以 将 线 程 内 核 对 象 视 为 由 关 于 线 程 的统 计 信 息 组 成 的 一 个 小 型 数 据 结 构 。 这 与 进程 和 进 程 内 核 对 象 之 间 的 关 系 是 相 同 的 。 系统 从 进 程 的 址 空 间 中 分 配 内 存 , 供 线 程 的 堆栈 使 用 。 新 线 程 运 行 的 进 程 环 境 与 创 建 线 程的 环 境 相 同 。 因 此 , 新 线 程 可 以 访 问 进 程 的内 核 对 象 的 所 有 句 柄 、 进 程 中 的 所 有 内 存 和在 这 个 相 同 的 进 程 中 的 所 有 其 他 线 程 的 堆 栈 。这 使 得 单 个 进 程 中 的 多 个 线 程 确 实 能 够 非 常容 易 地 互 相 通 .

p s a 参 数 是 指 向 S E C U R I T Y _ AT T R I B U T E S结 构的 指 针 。

c b S t a c k 参 数 用 于 设 定 线 程 可 以 将 多 少 地 址空 间 用 于 它 自 己 的 堆 栈 。

p f n S t a r t A d d r 参 数 用 于 指 明 想 要 新 线 程 执 行的 线 程 函 数 的 地 址 。

f d w C r e a t e 参 数 可 以 设 定 用 于 控 制 创 建 线 程的 其 他 标 志 。

C r e a t e T h r e a d 的 最 后 一 个 参 数 是 p d w T h r e a d I

D , 它 必 须 是 D W O R D 的 一 个 有 效 地 址 Cr e a t e T h r e

a d 使 用 这 个 地 址 来 存 放 系 统 分 配 给 新 线 程 的60

Page 67: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

ID 。该 程 序 唯 一 使 用 线 程 的 地 方 是 当 服 务 器 端

监 听 连 接 成 功 后 会 重 新 生 成 一 个 用 于 传 输 的套 接 字 , 并 且 重 新 派 生 一 个 子 线 程 来 为 客 服端 传 过 来 的 消 息 匹 配 并 传 送 给 具 体 的 消 息 处理 函 数 。

hThread = CreateThread(NULL,0,ClientThread,

(LPVOID)&myStructure,0,&dwThreadId);

上 述 是 创 建 新 线 程 的 一 行 语 句 , 下 面 是 绑 定

的 线 程 函 数 ClientThread 的 实 现 :DWORD WINAPI ClientThread(LPVOID lpParam)

{

HWND hWnd;

SOCKET MySocket;

FD_SET SocketSet;

struct timeval timeout;

charszMessage[2049];

DWORD iRecv;

struct myStruct *myStructure;

DWORD iLength;

DWORD iRet;

int iUpdates;

myStructure = (struct myStruct *)lpParam;

MySocket = myStructure->Socket;

61

Page 68: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

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)

{

62

Page 69: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

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;

}

具 体 思 想 是 : 客 户 端 线 程 函 数 , 这 个 函 数

等 候 从 客 户 端 程 序 发 送 过 来 的 消 息 , 然 后 对

63

Page 70: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

消 息 SOCKET 中 取 出 消 息 结 构 体 从 而 对 具 体 消 息

关 键 字 进 行 匹 配 , 匹 配 成 功 的 话 , 就 转 向 具

体 的 消 息 处 理 函 数 。

匹 配 条 件 约 束 如 下 :

如 果 这 个 消 息 是 "REFRESH", 那 么 它 发 送 当 前 的

桌 面 图 片

如 果 这 个 消 息 是 "DISCONNECT",那 么 它 结 束 和 客

户 端 的 连 接

如 果 这 个 消 息 以 "WM_" 开 头 , 那 么 它 就 根 据

消 息 类 型 , 在 服 务 器 端 执 行 该 消 息

3.5消 息 模 拟

众 所 周 知 , WINDOWS 是 采 用 的 消 息 循 环 机 制 。WINDOWS 程 序 的 进 行 依 靠 外 部 发 生 的 事 件 来 驱动 。 换 句 话 说 , 程 序 不 断 等 待 一 个 WHILE循 环 ,等 待 任 何 可 能 的 输 入 , 然 后 做 判 断 , 然 后 再做 适 当 的 处 理 。 用 户 输 入 是 由 操 作 捕 捉 到 之

64

Page 71: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

后 , 以 消 息 循 环 进 入 程 序 之 中 。 操 作 系 统 如何 捕 捉 到 外 围 设 备 所 发 生 的 事 件 呢 ?USER

模 块 掌 管 各 个 外 围 驱 动 程 序 , 他 们 各 有 侦 测循 环 。

如 果 对 应 用 程 序 获 得 的 各 种 输 入 进 行 分 类 ,可 以 分 为 由 硬 件 装 置 所 产 生 的 消 息 , 他 被 放在 系 统 消 息 队 列 中 , 而 其 他 由 WINDOWS 系 统 或其 他 WINDOWS 程 序 发 过 来 的 消 息 , 放 在 程 序 队列 中 。

接 收 并 处 理 消 息 的 主 角 就 是 窗 口 。 每 一 个窗 口 都 有 一 个 函 数 负 责 处 理 消 息 , 程 序 员 必须 负 责 设 计 这 个 窗 口 函 数 。 如 果 窗 口 获 得 一个 消 息 , 则 这 个 窗 口 函 数 必 须 判 断 消 息 的 类别 , 和 决 定 其 处 理 方 式 。

3.5.1 实 现 原 理

在 一 般 的 应 用 程 序 中 , 用 户 敲 击 键 盘 或 者鼠 标 的 消 息 都 是 直 接 首 先 被 外 设 的 驱 动 程 序所 截 获 , 然 后 外 设 的 驱 动 程 序 将 这 些 消 息 加入 系 统 的 消 息 队 列 中 , 这 样 应 用 程 序 可 以 从消 息 队 列 中 得 到 该 消 息 并 进 行 相 应 的 处 理 。

65

Page 72: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

但 是 对 于 有 些 程 序 来 说 , 无 法 提 供 外 设 的 输入 , 而 需 要 自 己 应 用 程 序 模 拟 这 些 外 设 消 息 ,并 将 这 些 消 息 直 接 发 送 到 系 统 的 消 息 队 列 中去 。 这 样 的 技 术 被 称 为 消 息 模 拟 。 这 样 客 户端 可 以 随 意 的 操 纵 服 务 器 端 的 应 用 程 序 , 所以 也 就 需 要 服 务 器 端 程 序 向 操 作 系 统 发 送 来自 客 服 端 的 任 何 鼠 标 键 盘 的 模 拟 消 息 。

相 关 的 功 能 函 数 介 绍 如 下 :1 Keybd_event 函 数VOID key_event(BYTE bvk,BYTE bScan,DWORD dwFlags,ULONG_PTR

dwExtraInfo)

bVk: 定 义 了 一 个 虚 拟 键 码 , 它 的 范 围 是 1 -254

bScan: 保 留dwFlags: 定 义 函 数 操 作 类 型 , 按 下 或 弹 起DwExtraInfo: 定 义 了 击 键 的 额 外 关 联 值程 序 中 想 要 模 拟 PRINTSCRN 的 消 息 , 去 抓 取

屏 幕 的 内 容 并 将 其 保 存 到 剪 切 板 中 , 那 么 可以 将 参 数 BVK 设 置 为 VK_SNAPSHOT 。 程 序 中 想 要模 拟 一 个 键 被 按 下 和 弹 起 应 这 样 写 :

keybd_event((BYTE)vk,(BYTE)vk,0,0)keybd_event((BYTE)vk,(BYTE)vk,KEYEVENTF_KEYUP,0)

2 mouse_event 函 数VOID mouse_event(DWORD dwFlags,DWORD dx,DWORD

dy,DWORDdwData,ULONG_PTR dwExtraInfo)

66

Page 73: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

dwFlags: 定 义 各 种 鼠 标 移 动 和 点 击 的 标 志 。Dx:定 义 沿 着 X轴 的 绝 对 位 置Dy:定 义 沿 着 Y轴 的 绝 对 位 置dwData:如 果 dwFlags包 括 了 MOUSEEVENTF_WHEEL的 标

志 , 则 dwData 定 义 鼠 标 滚 轮 的 运 动 数 量 。 正 值表 示 滚 轮 向 前 旋 转 。 负 值 表 示 滚 轮 向 后 旋 转 。滚 轮 被 按 下 的 标 志 是 WHEEL_DELTA

dwExtraInfo: 定 义 与 鼠 标 事 件 关 联 的 额 外 的 信息 。 应 用 程 序 可 以 调 用 GetMessageExtraInfo 获 得 这 些额 外 信 息 。

3.5.2 实 现 原 理 代 码 分 析

下 面 我 们 就 来 看 下 鼠 标 键 盘 模 拟 消 息 的 源 代码 部 分 :

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;}

67

Page 74: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

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;charszString2[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);

iParms++;if (iParms == 5)

break;}

68

Page 75: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

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;

fWMMouseMsg = FALSE;for (iLoop = 0;iLoop < nWMMouseMsg;iLoop++){

if (strcmp(pCommandNode->Command.szElement,WMMouseMsg[iLoop].szWMMouseMsg) == 0)

{ fWMMouseMsg = TRUE;

if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MM\0") == 0)

iMessage = 1;else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBD\0") == 0)iMessage = 2;

else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBU\0") == 0)

iMessage = 3;else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBK\0") == 0)iMessage = 4;

else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBD\0") == 0)

iMessage = 5;else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBU\0") == 0)

69

Page 76: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

iMessage = 6;else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBK\0") == 0)iMessage = 7;

else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBD\0") == 0)

iMessage = 8;else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBU\0") == 0)iMessage = 9;

else if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBK\0") == 0)

iMessage = 10;

pCommandNode = pCommandNode->pNext;iX = atof(pCommandNode->Command.szElement);

pCommandNode = pCommandNode->pNext;iY = atof(pCommandNode->Command.szElement);

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;

70

Page 77: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

if (iMessage == 1) {

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,dwX,dwY,0,0);

}else if (iMessage == 2) {

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);

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);

}else if (iMessage == 5) {

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

}else if (iMessage == 6) {

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);

}else if (iMessage == 7) {

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

71

Page 78: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);

}else if (iMessage == 8) {

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);

}else if (iMessage == 9) {

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);

}else if (iMessage == 10){

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);

}}else{

fWMKeyBdMsg = FALSE;for (iLoop = 0;iLoop < nWMKeyBdMsg;iLoop++){

if (strcmp(pCommandNode->Command.szElement,WMKeyBdMsg[iLoop].szWMKeyBdMsg) == 0)

{

fWMKeyBdMsg = TRUE;if

(strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KD\0") == 0)iMessage = 1;

else if (strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KU\0") == 0)

iMessage = 2;

72

Page 79: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

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);

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);

}}

设 计 原 理 基 本 思 想 是 , SOCKET 收 到 数 据 后 ,会 立 刻 把 他 加 入 到 COMMAND 链 表 结 构 体 中 , 然后 对 消 息 Command.szElement 的 前 3 字 节 与 消 息 关 键 字进 行 匹 配 , 匹 配 成 功 的 话 就 用 上 述 两 条 API函数 在 本 机 模 拟 键 盘 和 鼠 标 消 息 。

73

Page 80: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

3.6 图 形 编 码

该 程 序 数 据 图 型 编 码 采 用 的 是 C库 中 的 哈夫 曼 压 缩 编 码 技 术 , 下 面 稍 作 解 释 以 下 :

哈夫曼编码的原理是:一个符号发生频率越高,其码长越短,反之则越长。很好理解:要使总长最短,出现越多次的符号的编码就要越短。 打个不恰当的比方,现在用的最多的几个汉字“个”“的”“们”“什”“么”什么的笔画不是都很少吗?这就是文字演变的规律,也就是哈夫曼编码的原理。

哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去 25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了 3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。

下面在补充介绍下WINDOWS图形输入输出处理对象GDI。是一个比较复杂的技术:

Windows 程 序 不 仅 在 输 入 上 与 DOS 程 序 不 同 ,

而 且 在 程 序 输 出 上 也 与 DOS 有 着 很 大 不 同 , 主

要 表 现 为 :

74

Page 81: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

    1.DOS 程 序 独 占 整 个 显 示 屏 幕 , 其 他 程 序 在

后 台 等 待 。 而 Windows 的 每 一 个 应 用 程 序 对 屏

幕 的 一 部 分 进 行 处 理 。 DOS 程 序 可 以 直 接 往 屏

幕 上 输 出 , 而 Windows 是 一 个 多 窗 口 的 操 作 系

统 , 由 操 作 系 统 来 统 一 管 理 屏 幕 输 出 ; 每 个

窗 口 要 输 出 内 容 时 , 必 须 首 先 向 操 作 系 统 发

出 请 求 (GDI 请 求 ) , 由 操 作 系 统 完 成 实 际 的 屏

幕 输 出 工 作 。

    2.Windows 程 序 的 所 有 输 出 都 是 图 形 。 Windows

提 供 了 丰 富 的 图 形 函 数 用 于 图 形 输 出 , 这 对

输 出 图 形 是 相 当 方 便 的 , 但 是 由 于 字 符 也 被

作 为 图 形 来 处 理 , 输 出 时 的 定 位 要 比 DOS 复 杂

的 多 。

    比 如 , 在 DOS 字 符 方 式 下 , 我 们 可 以 写 出 如

下 程 序 用 于 输 出 两 行 文 字 :75

Page 82: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

printf(“Hello,\n”);printf(“This is DOS program.\n”);

    而 在 Windows 下 要 输 出 这 两 行 文 字 所 做 的 工

作 要 复 杂 的 多 。 因 为 Windows 输 出 是 基 于 图 形

的 , 它 输 出 文 本 时 不 会 象 DOS 那 样 自 动 换 行 ,

而 必 须 以 像 素 为 单 位 精 确 定 位 每 一 行 的 输 出

位 置 。 另 外 , 由 于 Windows 提 供 了 丰 富 的 字 体 ,

所 以 在 计 算 坐 标 偏 移 量 时 还 必 须 知 道 当 前 所

用 字 体 的 高 度 和 宽 度 。

    3.Windows 下 的 输 出 是 设 备 无 关 的 。 在 DOS 下 编

写 过 Foxpro程 序 的 读 者 常 常 会 有 这 样 的 体 会 ,

在 编 写 打 印 报 表 程 序 时 , 要 针 对 不 同 的 打 印

机 在 程 序 中 插 入 不 同 的 打 印 控 制 码 , 用 以 控

制 换 页 、 字 体 设 置 等 选 项 。 这 样 的 程 序 编 写

起 来 繁 琐 , 而 且 不 容 易 移 植 ( 因 为 换 一 台 不

76

Page 83: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

同 型 号 的 打 印 机 就 要 重 新 修 改 程 序 ) 。 而

Windows 下 的 应 用 程 序 使 用 图 形 设 备 接 口

( GDI ) 来 进 行 图 形 输 出 。 GDI 屏 蔽 了 不 同 设

备 的 差 异 , 提 供 了 设 备 无 关 的 图 形 输 出 能 力 ,

Windows 应 用 程 序 只 要 发 出 设 备 无 关 的 GDI 请 求

( 如 调 用 Rectangle画 一 个 矩 形 ) , 由 GDI 去 完 成

实 际 的 图 形 输 出 操 作 。 对 于 一 台 具 有 打 印 矩

形 功 能 的 PostScript打 印 机 来 说 , GDI 可 能 只 需 要

将 矩 形 数 据 传 给 驱 动 程 序 就 可 以 了 , 然 后 由

驱 动 程 序 产 生 PostScript命 令 绘 制 出 相 应 的 矩 形 ;

而 对 于 一 台 没 有 矩 形 输 出 功 能 的 点 阵 打 印 机

来 说 , GDI 可 能 需 要 将 矩 形 转 化 为 四 条 线 , 然

后 向 驱 动 程 序 发 出 画 线 的 指 令 , 在 打 印 机 上

输 出 矩 形 。 当 然 , 这 两 种 输 出 在 用 户 看 来 并

没 有 什 么 区 别 。77

Page 84: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

    Windows 的 图 形 输 出 是 由 图 形 设 备 接 口

( GDI ) 来 完 成 的 , GDI 是 系 统 原 始 的 图 形 输

出 库 , 它 用 于 在 屏 幕 上 输 出 像 素 、 在 打 印 机

上 输 出 硬 拷 贝 以 及 绘 制 Windows 用 户 界 面 。

    GDI 提 供 两 种 基 本 服 务 : 创 建 图 形 输 出 和 存

储 图 象 。 GDI 提 供 了 大 量 用 于 图 形 输 出 的 函 数 ,

这 些 函 数 接 收 应 用 程 序 发 出 来 的 绘 图 请 求 、

处 理 绘 图 数 据 并 根 据 当 前 使 用 设 备 调 用 相 应

的 设 备 驱 动 程 序 产 生 绘 图 输 出 。 这 些 绘 图 函

数 分 为 三 类 : 一 是 文 字 输 出 , 二 是 矢 量 图 形

函 数 , 用 于 画 线 、 圆 等 几 何 图 形 , 三 是 光 栅

( 位 图 ) 图 形 函 数 , 用 于 绘 制 位 图 。

    GDI 识 别 四 种 类 型 的 设 备 : 显 示 屏 幕 、 硬 拷

贝 设 备 ( 打 印 机 、 绘 图 机 ) 、 位 图 和 图 元 文

件 。 前 两 者 是 物 理 设 备 , 后 两 者 是 伪 设 备 。78

Page 85: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

一 个 伪 设 备 提 供 了 一 种 在 RAM 里 或 磁 盘 里 存 储

图 象 的 方 法 。 位 图 存 放 的 是 图 形 的 点 位 信 息 ,

占 用 较 多 的 内 存 , 但 速 度 很 快 。 图 元 文 件 保

存 的 是 GDI 函 数 的 调 用 和 调 用 参 数 , 占 用 内 存

较 少 , 但 依 赖 于 GDI , 因 此 不 可 能 用 某 个 设 备

来 创 建 图 元 文 件 , 而 且 速 度 比 位 图 要 慢 。

    GDI 的 图 形 输 出 是 面 向 窗 口 的 , 面 向 窗 口 包

含 两 层 含 义 :

    ( 1 ) 每 个 窗 口 作 为 一 个 独 立 的 绘 图 接 口 来

处 理 , 有 它 自 己 的 绘 图 坐 标 。 当 程 序 在 一 个

窗 口 中 绘 图 时 , 首 先 建 立 缺 省 的 绘 图 坐 标 ,

原 点 ( 0 , 0 ) 位 于 窗 口 用 户 区 的 左 上 角 。 每

个 窗 口 必 须 独 立 的 维 护 自 己 的 输 出 。

    ( 2 ) 绘 图 仅 对 于 本 窗 口 有 效 , 图 形 在 窗 口

边 界 会 被 自 动 裁 剪 , 也 就 是 说 窗 口 中 的 每 一79

Page 86: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

个 图 形 都 不 会 越 出 边 界 。 即 使 想 越 出 边 界 ,

也 是 不 可 能 的 , 窗 口 会 自 动 的 防 止 其 他 窗 口

传 过 来 的 任 何 像 素 。 这 样 , 你 在 窗 口 内 绘 图

时 , 就 不 必 担 心 会 偶 然 覆 盖 其 他 程 序 的 窗 口 ,

从 而 保 证 了 Windows 下 同 时 运 行 多 个 任 务 时 各

个 窗 口 的 独 立 性 。

3.7 总 体 框 架 的 实 现

首先,我要解释一下什么是回调函数,在程序中对话框消息处理函数就是使用的回调函数。因为有些时候回调函数除了你需要调用它,有很多时候操作系统也需要调用它,窗口设计成一个回调函数才开放出一个窗口让操作系统也可以去调用它。我们再来讨论一下什么是 WIN32应用程序。WINDOWS 程序是由视窗和信息构成的,这一点毋庸置疑。

进行 Windows 程式设计,实际上是在进行一种面向对象的程式设计(OOP)。这一点在 Windows中使用得最多的工具对象上表现最为明显。这些对象正是 Windows之所以命名为 Windows 的原因,因为就是因为对象的存在,使得那个叫做视窗的东西出现。桌面上最明显的视窗就是应用程式视窗。这些视窗含有显示程式名称的标题列功能表甚至可能还有工具列和卷动列。

另一类视窗是对话框,它可以有标题列也可以没有标题列。装饰对话方框表面的还有各式各样的按键、单选按钮、核取方块、清单方块、卷动列和文字输入区域。其中每一个小的视觉物件都是一个视窗。更确切地说,这些都称为子视窗或控制项视窗或子视窗控制项。作为对象,使用者会在萤幕上看到这些视窗,并通过键盘和滑鼠直接与它们进行交互操作。更有趣的是,程式写作者的观点与使用者的观点极其类似。视窗以消息的形式接收视窗的输入,视窗也用

80

Page 87: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

消息与其他视窗通讯。3.7.1 服 务 器 端 实 现 原 理

远程监控的思想是通过 SOCKET 和利用应用程序的消息机制,监控程序的客服端与被监控程序的服务器端进行数据交换,达到监控与被监控的目的。根据这个思想,需要两个独立的程序,SERVER REMOTE CONTROL 和

CLIENT REMOTE CONTROL。Server remote control 所需要的模块如下。

网络模块:负责监听客服端的连接,负责接收并处理客服端发过来的消息命令,在本机上处理这些消息并发送各种数据,如屏幕数据,命令反馈数据等,到客服端监听程序。

编码解码模块:负责对数据进行哈夫曼压缩。这个模块是根据客户端的要求来采用具体的编码解码方法的。

主框架模块:负责 SERVER 端窗口的消息处理 客服端实现原理3.7.2 客 服 端 实 现 原 理

网络模块:负责连接到服务器的监听 SOCKET;负责向服务器发送各种操作命令,如鼠标,键盘,各种参数消息等命令。

主框架模块:负责 CLIENT 的窗口消息处理3.7.3 数 据 流 实 现 原 理

首先启动 Sever Remote Control 的 程 序 , 开启监听端口,将 CLIENT

REMOTE CONTROL 连接到服务器的端口,之后 SERVER 开启一个与客服端通信的线程

81

Page 88: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

这个线程专门负责接收和处理客服端发送过来的消息,并在本机上执行相关命令。然后将当前改变区域的屏幕的内容发送到客服端。而当客服端连接到服务器端之后,客服端程序就可以根据服务器端传过来的屏幕数据在本地机上显示出屏幕内容,从而作出各种鼠标,键盘操作,以及一些通用的更新。这些操作会通过 SOCKET 传给服务器端。服务器端再根据这些消息做出相应的操作。

需要注意的是,服务器端刷屏的时候并不是将整个屏幕都传给客服端,因为整个屏幕图片的数据量比较大,当前网络负载也不是很稳定的条件下,该程序是很不稳定的。一个可行的办法是将屏幕的划分成网格块,屏幕的刷新是以网格为单位的,只需要将这些变化的屏幕数据发送给客服端即可。

3.8设 计 完 成 感 受

大 部 分 实 现 借 鉴 的 很 多 参 考 资 料 , 从 分 说 明了 自 己 还 要 学 习 的 东 西 还 有 很 多 很 多 。

82

Page 89: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

第 4章 测 试软件测试是一个心理技术交织在一起的的复杂过程。在其中分为测试对象

和测试配置。测试对象,软件测试与程序测试的概念上有所不同,软件测试的对象不仅

是程序,还包括软件需求规格文档,设计规格文档,模块算法这些软件文档配置项。软件测试的内容贯穿于软件定义与开发的全部阶段。测试配置,这是预先定义好的一套测试方案,包括测试计划,测试过程,

测试实例集合和所预期的执行结果。实际上从整个软件的生存周期来看,测试配置是软件配置中的一个子集。最终提交的软件配置项应该是包括上述软件配置项以及测试的实际结果和排错记录。

设法确定错误的准确位置并且改正它,这就是软件排错的任务。排错过程是测试过程的一下部分。为了诊断并纠正一个程序的错误,可能需要花费一小时,一天甚至一个月的时间。正是由于排错具有不确定性,常常使测试不能正确进行。

在测试阶段积累的测试结果,可以用更形式化的方法进行统计分析。根据条件所限制我这里写了三个 testcase,来对代码进行黑盒测试。

4.1 Testcase 的 设 计

Firmware : VC++ 6.0Platform : windows

这里仅做了功能测试,由于条件所限制,不能作出很好的协议,性能,负面和压力测试。4.1.1 测 试 用 例 1 说 明

在服务器端口上面输入大于 65535 的端口号,此时服务器程序没有报错,同时在客服端也输入大于 65535 的端口号,程序也没有报错,只是在连接时出现系统调用连接出错。从而证明这是一个程序遗漏,应该确定端口输入范围。

83

Page 90: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

4.1.2 测 试 用 例 2 说 明

在客户端程序中输入不正确的 IP 地址格式,同样会出现程序自身不会给出提示,只是在连接操作时报连接出错。4.1.3 测 试 用 例 3 说 明

我们按照程序操作过程反其道而行之,先开客服端程序,再开服务器端程序。此时出现超时连接的情况,程序能够正常工作,同样会报连接出错的MESSAGE_BOX 信息框。4.1.4 测 试 结 果

该程序基本上能够完成所述功能,但仍有细节上的纰漏。

84

Page 91: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

第 5章 结 果 和 结 论这次设计的难点在于图形图像的处理,我最终不能掌握其要点,通过了很

多参考资料文献和支撑库才能了解其皮毛。最终设计是将 PRTSCSYSRQ 键所截的图以八行四列的形式分成了三十二个小块通过 SOCKET以块为数据单位发送数据图像。数据图像在发送前需要压缩,到达客服端时也需要解压,我尝试取消图形解压和分块的功能,但是这样的大数据流,一般的网速完全负载不了,延迟情况严重,就算开启这两个功能,网速过慢的原因同样造成了严重的延迟。

我认为,当今网络程序的生与死,网络流量保证是一个门槛,而导致这个门槛的主要原因,我认为是路由器的原因,路由器在转发数据的时候分别从一层条 到三层又封包从三层到一层,在转发包的过程中做了多少操作

这个过程中如果又涉及到 N AT,VPN,IPSEC,IKE,DHCP,AUTHNICATON等技术的阻挠,导致网络瓶颈日趋严重。但如果把所有的路由器换成交换机也是不现实的,每一台交换机都要存放网络上所有主机服务器的 MAC 的地址,这需要的存储空间也不是一个小数字。

IPV6 的出现解决了 IP 地址不够用的现状,但日趋使用的 P2P流泛滥也让网络出现的新的问题。现在数据传输速率上已达到光速,需解决的问题也就是各节点转包的效率问题了。终究网络的发展还在成长阶段。

这次的设计是基于网络平台的,结果是否稳定都依赖于网络,而且数据没有加密,安全性很差。

从这次设计我学习到了丰富的网络知识,同时 VC 的使用也从 0变为较为熟悉,但所有的一切都还是一个成长阶段,但我的兴趣从软件过度到了网络。使得我对网络的求知欲有一个量的飞跃。

所幸的是我现在从事的工作是测试网络仪器,路由器,交换机和硬件防火墙,我的大学生活就此结束,但前面的路还很遥远,我要学习的路是无休止的。大学生活带给我很多快乐和泪水,使我从跌倒中爬了起了,我学会了自强,自信。希望这一切会伴随我不断进步。

85

Page 92: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

致 谢 本 次 设 计 任 务 业 已 顺 利 完 成 , 但 由 于 本 人水 平 有 限 缺 乏 经 验 , 难 免 留 下 一 些 遗 憾 。 感谢 袁 超 老 师 的 教 导 才 使 我 能 够 很 好 很 快 的 完成 这 次 设 计 , 在 此 恳 请 各 位 老 师 同 学 的 不 吝赐 教 。由 于 经 验 不 足 , 毕 业 设 计 难 免 有 许 多 不 周 全的 地 方 , 在 这 里 非 常 感 谢 我 的 指 导 老 师 , 袁超 老 师 , 在 毕 业 设 计 的 每 个 阶 段 , 给 予 了 我悉 心 的 指 导 , 协 助 我 解 决 了 很 多 问 题 , 让 我学 会 了 如 何 透 彻 的 理 解 网 络 通 信 原 理 和 实 现技 巧 。 以 及 理 论 和 实 践 有 冲 突 时 , 要 两 相 结合 来 考 虑 问 题 , 从 而 寻 找 良 好 的 解 决 方 案 。

再 次 对 我 的 指 导 老 师 表 示 诚 挚 的 感 谢 和 崇高 的 敬 意 , 再 次 感 谢 四 川 理 工 学 院 给 我 这 次机 会 锻 炼 自 己 。

感 谢 我 的 同 学 。

86

Page 93: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

参 考 文 献

[1] 丁展 刘海英.windows网络通信编程[M].人民邮电出版社,2005,20(6):

33~36

[2] 陈家琪.C程序设计教程[M].北京:新华出版社,2004.11.

[3] 侯俊杰. 深入浅出MFC第二版[M] 华中科技大学出版社[4] 电子文档 深入理解WINDOWS核心编程[M]

[5] 周 枫 刘 晓 燕 软 件 工 程 [M] 重 庆 大 学 出 版社

[6] 贝 尔 实 验 室 高 级 C++ 程 序 设 计 [M] 机 械 工 业出 版 社

[6] 软 件 工 程 教 研 室 毕 业 设 计 指 导 [J] 软 件 工 程教 研 室

[7] 丁 磊 Winsock 开发网络通信程序的经典入门[J]

[8] (美) Scott Meyers Effective C++[M] 机械工业出版社[9] W.Richard Stevens TCP/IP Illustrared[M] 机械工业出版社[10] 许斌 JXTA-Java P2P 网络编程技术[M] 清华大学出版社[11] 张炯 Unix网络编程实用技术与实例分析 清华大学出版社

87

Page 94: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

附 录

附 录 A: 软 件 使 用 说 明 书

首 先 构 架 好 物 理 网 络 , 因 为 在 WINDOWS 平 台上 运 行 , 所 以 尽 可 能 关 掉 象 防 火 强 , 安 全 卫士 等 阻 碍 软 件 。 物 理 网 络 中 可 以 搭 建 路 由 器 ,交 换 机 , 集 线 器 等 一 , 二 , 三 层 设 备 。

然 后 开 启 客 服 端 程 序 , 在 客 服 端 程 序 中 输入 服 务 器 的 IP 地 址 和 服 务 端 口 。 点 击 连 接 ,等 待 连 接 成 功 后 , 服 务 器 端 的 桌 面 图 像 便 会投 影 到 客 户 端 的 用 户 区 内 , 用 户 在 客 服 端 的对 服 务 器 端 的 桌 面 进 行 操 作 与 监 控

88

Page 95: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

物 理 模 型

图 5-9

5.1.1 注 释

1 PC框为电脑终端 2 SW框为交换机 3 圆框为路由器5.1.2 说 明

这是一个基本的网络拓扑原型,更多的网络拓扑原型可以自己定制。客服端PC监控服务器端PC,这是一个简单的CS模型架构。客服器端PC通过TCP协议与服务器端PC建立连接,这是一个三次握手的过程。建立连接后,两台主机及可以互相通信。

逻 辑 模 型

89

Page 96: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

图 5-10

5.1.3 说 明

该程序为客服端控制服务器端,服务器端以一定的速率截图并发给客服端,客服端受到图片数据后进行解压并且发送鼠标消息和键盘消息,服务器端收到消息后模拟这些消息,达到远程控制的实现。

运 行 环 境

5.1.4 硬 件 平 台

1. 至 少 两 台 计 算 机 或 者 两 台 以 上2. 如 果 是 两 台 计 算 机 直 连 需 要 交 叉 线 否 者

需 要 并 行 双 绞 线3. 做 测 试 用 需 要 路 由 器 , 交 换 机 或 者 硬 件

防 火 墙

90

Page 97: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

5.1.5 软 件 平 台

1. 必 须 是 WINDOWS平 台 下2. 如 果 是 在 VISTA 版 本 下 则 需 要 VC6.0 下 的

DEBUG 文 件 夹3. 软 件 防 火 墙 必 须 关 闭

5.1.6 网 络 环 境

1. 必须在没有 NAT 或者 DHCP 的网络中运行方可达到稳定性,否者不稳定私网地址可能会重复。

2. 如果想要测试效果较好可在局域网或者直连的方式进行3.套接字端口最好选择 5000以上的,因为有默认服务与预定义端口的

存在

91

Page 98: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

附 录 B: 核 心 代 码

5.1.7 服 务 器 端

1 服务器端窗口消息处理函数HANDLE hThread;

DWORD dwThreadId;

BYTE CMainWnd::m_ip[4];

CMainWnd::CMainWnd()

{

}

CMainWnd::~CMainWnd()

{

delete this;

ClearDisplay(m_hWnd);

}

void CMainWnd::SetInstance(HINSTANCE hInst)

{

m_hInst = hInst;

}

BOOL CMainWnd::OnCreate(HWND hWnd,CREATESTRUCT FAR

*lpCreateStruct)

92

Page 99: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

{

lpCreateStruct->cx=400;

lpCreateStruct->cy=600;

lpCreateStruct->x=100;

lpCreateStruct->y=100;

ShowWindow(hWnd,*(LPINT)lpCreateStruct->lpCreateParams);

m_hWnd = hWnd;

m_hMenu = GetMenu(m_hWnd);

EnableMenuItem(m_hMenu,IDM_STARTSERVER,MF_BYCOMMAND|

MF_ENABLED);

EnableMenuItem(m_hMenu,IDM_STOPSERVER,MF_BYCOMMAND|

MF_GRAYED);

WSADATA wsd;

char szString[255];

char name[20];

if (WSAStartup(0x202,&wsd) != 0)

{

sprintf(szString,"Failed to load Winsock!");

MessageBox(NULL,szString,"Remote Server",MB_OK);

return 1;

}

GetLocalHostName(name);

GetIpAddress(name,&m_ip[0],&m_ip[1],&m_ip[2],&m_ip[3]);

return TRUE;

}

void CMainWnd::OnDestroy(HWND hWnd)

{

closesocket(Listen);

93

Page 100: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

WSACleanup();

PostMessage(hWnd,WM_QUIT,(WPARAM)0,0L);

}

void CMainWnd::OnGetMinMaxInfo(HWND hWnd,MINMAXINFO FAR*

lpMinMaxInfo)

{

RECT size;

size.bottom=1000;

size.top=100;

size.left=100;

size.right=1000;

lpMinMaxInfo->ptMaxTrackSize.x = size.right-size.left;

lpMinMaxInfo->ptMaxTrackSize.y = size.bottom-size.top;

lpMinMaxInfo->ptMaxSize.x = size.right-size.left;

lpMinMaxInfo->ptMaxSize.y = size.bottom-size.top;

}

void CMainWnd::OnKeyDown(HWND hWnd,UINT vk,BOOL fDown,int

cRepeat,UINT flags)

{

if (vk == VK_ESCAPE || vk == VK_F12)

PostMessage(hWnd,WM_CLOSE,0,0);

}

BOOL CALLBACK SettingItemProc(HWND hwndDlg, UINT message, WPARAM

wParam, LPARAM lParam)

{

BOOL b;

char name[15];

switch (message)

{

case WM_INITDIALOG:

94

Page 101: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

sprintf(name,"%d.%d.%d.

%d",CMainWnd::m_ip[0],CMainWnd::m_ip[1],CMainWnd::m_ip[2],CMainWnd::

m_ip[3]);

::SetDlgItemInt(hwndDlg,IDC_EDIT1,gPort,false);

::SetDlgItemText(hwndDlg,IDC_IP,name);

return TRUE;

case WM_COMMAND:

switch (LOWORD(wParam))

{

case IDOK:

gPort=::GetDlgItemInt(hwndDlg, IDC_EDIT1,&b, false);

case IDCANCEL:

EndDialog(hwndDlg, wParam);

return TRUE;

}

}

return FALSE;

}

void CMainWnd::OnCommand(HWND hWnd,int iId,HWND hWndCtl,UINT

iCodeNotify)

{

if (iId == IDM_EXIT)

{

if (hThread)

{

closesocket(Listen);

WSACleanup();

PostQuitMessage(0);

}

else if (iId == IDM_STARTSERVER)

{

95

Page 102: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

if (DialogBox(this->m_hInst,

MAKEINTRESOURCE(IDD_DIALOG),

hWnd, (DLGPROC)SettingItemProc)==IDOK)

{

ShowWindow(hWnd,SW_MINIMIZE);

RedrawWindow(hWnd,NULL,NULL,RDW_ERASE|

RDW_INVALIDATE);

hThread = CreateThread(NULL,0,LoadWinsock,

(LPVOID)NULL,0,&dwThreadId);

if (hThread == NULL)

MessageBox(hWnd,"Socket线程创建失败","远程控制服务器端",MB_ICONEXCLAMATION|MB_OK);

else

{

InitDisplay(hWnd);

hServerWnd = hWnd;

EnableMenuItem(m_hMenu,IDM_STARTSERVER,MF_BYCOMMAND|

MF_GRAYED);

EnableMenuItem(m_hMenu,IDM_STOPSERVER,MF_BYCOMMAND|

MF_ENABLED);

}

}

}

else if (iId == IDM_STOPSERVER)

{

if(MessageBox(hWnd,"你真的想关闭远程控制服务?","远程控制服务器端",MB_YESNO)==IDYES)

96

Page 103: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

{

EnableMenuItem(m_hMenu,IDM_STARTSERVER,MF_BYCOMMAND|

MF_ENABLED);

EnableMenuItem(m_hMenu,IDM_STOPSERVER,MF_BYCOMMAND|

MF_GRAYED);

ClearDisplay(hWnd);

// 终结线程if (hThread)

{

// 清除监听窗口closesocket(Listen);

}

}

}

else if(iId==IDC_About)

{

MessageBox(hWnd,"2003-7-2创建一个远程控制的程序","远程控制服务器端",MB_OK);

}

}

int CMainWnd::GetLocalHostName(char* sHostName)

{

char szHostName[256];

int nRetCode;

nRetCode=gethostname(szHostName,sizeof(szHostName));

if(nRetCode!=0)

{

97

Page 104: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

//产生错误strcpy(sHostName,"没有取得");

return GetLastError();

}

strcpy(sHostName,szHostName);

return 0;

}

int CMainWnd::GetIpAddress(char *sHostName, char *sIpAddress)

{

struct hostent FAR * lpHostEnt=gethostbyname(sHostName);

if(lpHostEnt==NULL)

{

sIpAddress=NULL;

return GetLastError();

}

LPSTR lpAddr=lpHostEnt->h_addr_list[0];

if(lpAddr)

{

struct in_addr inAddr;

memmove(&inAddr,lpAddr,4);

strcpy(sIpAddress,inet_ntoa(inAddr));

}

return 0;

}

int CMainWnd::GetIpAddress(char *sHostName, BYTE *f0,BYTE *f1,BYTE

*f2,BYTE *f3)

{

struct hostent FAR * lpHostEnt=gethostbyname(sHostName);

if(lpHostEnt==NULL)

98

Page 105: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

{

f0=f1=f2=f3=0;

return GetLastError();

}

//获取IP

LPSTR lpAddr=lpHostEnt->h_addr_list[0];

if(lpAddr)

{

struct in_addr inAddr;

memmove(&inAddr,lpAddr,4);

*f0=inAddr.S_un.S_un_b.s_b1;

*f1=inAddr.S_un.S_un_b.s_b2;

*f2=inAddr.S_un.S_un_b.s_b3;

*f3=inAddr.S_un.S_un_b.s_b4;

}

return 0;

}

2 服务器端主程序体#include <winsock2.h>

#include <stdio.h>

#include <stdlib.h>

#include <winuser.h>

#include "Server.h"

#include "Command.h"

#include "Gdi.h"

#include "HuffCompress.h"

#include "RLE.h"

#define DEFAULT_PORT 5150

#define SETFLAGS XP1_GUARANTEED_DELIVERY|

XP1_GUARANTEED_ORDER

#define NOTSETFLAGS XP1_CONNECTIONLESS

99

Page 106: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

#define LPBMIH LPBITMAPINFOHEADER

UINT gPort = DEFAULT_PORT;

int nGridX = 8;

int nGridY = 2;

DWORD dwLen,dwCompress,dwSendLen;

int iCompressionLevel = 10;

HWND hServerWnd;

HDC hDDC = NULL,hMemDC,hNullDC;

BOOL fChange = FALSE;

SOCKET Socket;

SOCKET Listen;

int iWidth,iHeight;

WORD bmBitsPixel = 4;

BOOL fDIBitmap = FALSE;

struct GdiList GdiStart;

struct GdiList *pGdiNode;

struct myStruct

{

SOCKET Socket;

HWND hWnd;

};

int SelectProtocols(DWORD dwSetFlags,DWORD

dwNotSetFlags,LPWSAPROTOCOL_INFO lpProtocolBuffer,LPDWORD

lpdwBufferLength,WSAPROTOCOL_INFO *pProtocol);

DWORD WINAPI LoadWinsock(LPVOID lpParam)

{

LPBYTE pBuf;

100

Page 107: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

WSAPROTOCOL_INFO Protocol;

int nRet;

int nZero = 0;

int iAddrSize;

HANDLE hThread;

DWORD dwThreadId;

char szClientIP[81];

char szString[255];

struct sockaddr_in local,client;

struct myStruct myStructure;

dwLen = 0;

nRet = WSAEnumProtocols(NULL,NULL,&dwLen);

if (nRet == SOCKET_ERROR)

{

if (WSAGetLastError() != WSAENOBUFS)

return 1;

}

pBuf = malloc(dwLen);

nRet = SelectProtocols(SETFLAGS,NOTSETFLAGS,

(LPWSAPROTOCOL_INFO)pBuf,&dwLen,&Protocol);

Listen =

WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM)

;

if (Listen == SOCKET_ERROR)

{

sprintf(szString,"socket() failed: %d",WSAGetLastError());

MessageBox(NULL,szString,"Remote Server",MB_OK);

return 1;

101

Page 108: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

}

local.sin_addr.s_addr = htonl(INADDR_ANY);

local.sin_family = AF_INET;

local.sin_port = htons(gPort);

if (bind(Listen,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)

{

sprintf(szString,"bind() failed: %d\n", WSAGetLastError());

MessageBox(NULL,szString,"Remote Server",MB_OK);

return 1;

}

nZero = 0;

setsockopt(Listen,SOL_SOCKET,SO_SNDBUF,(char

*)&nZero,sizeof(nZero));

listen(Listen,SOMAXCONN);

iAddrSize = sizeof(client);

while (TRUE)

{

Socket = accept(Listen,(struct sockaddr *)&client,&iAddrSize);

if (Socket != INVALID_SOCKET)

{

myStructure.Socket = Socket;

myStructure.hWnd = hServerWnd;

memset(szClientIP,'\0',sizeof(szClientIP));

sprintf(szClientIP,"%s",inet_ntoa(client.sin_addr));

102

Page 109: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

hThread = CreateThread(NULL,0,ClientThread,

(LPVOID)&myStructure,0,&dwThreadId);

if (hThread)

{

CloseHandle(hThread);

}

}

else

return 1;

}

return 0;

}

DWORD WINAPI ClientThread(LPVOID lpParam)

{

HWND hWnd;

SOCKET MySocket;

FD_SET SocketSet;

struct timeval timeout;

charszMessage[2049];

DWORD iRecv;

struct myStruct *myStructure;

DWORD iLength;

DWORD iRet;

int iUpdates;

myStructure = (struct myStruct *)lpParam;

MySocket = myStructure->Socket;

103

Page 110: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

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';

CHECK_MSG:

if (strncmp(szMessage,"REFRESH",7) == 0)

{

iUpdates = SendRegionDisplay(hServerWnd,MySocket);

}

else if (strncmp(szMessage,"WM_",3) == 0)

{

DispatchWMMessage(szMessage);

104

Page 111: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

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;

}

105

Page 112: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

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;

charszString2[2049];

nWMMouseMsg = (int)(sizeof(WMMouseMsg)/sizeof(WMMouseMsg[0]));

nWMKeyBdMsg = (int)(sizeof(WMKeyBdMsg)/sizeof(WMKeyBdMsg[0]));

nMsg = (int)(sizeof(Msg)/sizeof(Msg[0]));

106

Page 113: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

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);

iParms++;

if (iParms == 5)

break;

}

pCommandNode = CommandStart.pNext;

if (pCommandNode)

{

UINT keyFlags;

int iMessage;

int fWMMouseMsg;

double iScaleX,iScaleY,iX,iY;

DWORD dwX,dwY;

107

Page 114: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

int fWMKeyBdMsg;

UINT vk;

int fDown;

int cRepeat;

UINT flags;

fWMMouseMsg = FALSE;

for (iLoop = 0;iLoop < nWMMouseMsg;iLoop++)

{

if (strcmp(pCommandNode-

>Command.szElement,WMMouseMsg[iLoop].szWMMouseMsg) == 0)

{

fWMMouseMsg = TRUE;

if (strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MM\

0") == 0)

iMessage = 1;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBD\0") == 0)

iMessage = 2;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBU\0") == 0)

iMessage = 3;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_LBK\0") == 0)

iMessage = 4;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBD\0") == 0)

iMessage = 5;

108

Page 115: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBU\0") == 0)

iMessage = 6;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_MBK\0") == 0)

iMessage = 7;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBD\0") == 0)

iMessage = 8;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBU\0") == 0)

iMessage = 9;

else if

(strcmp(WMMouseMsg[iLoop].szWMMouseMsg,"WM_RBK\0") == 0)

iMessage = 10;

pCommandNode = pCommandNode->pNext;

iX = atof(pCommandNode->Command.szElement);

pCommandNode = pCommandNode->pNext;

iY = atof(pCommandNode->Command.szElement);

pCommandNode = pCommandNode->pNext;

keyFlags = atoi(pCommandNode->Command.szElement);

break;

}

}

109

Page 116: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

if (fWMMouseMsg)

{

iScaleX = 65535.0 / (iWidth - 1);

iScaleY = 65535.0 / (iHeight - 1);

iX *= iScaleX;

iY *= iScaleY;

dwX = (DWORD)iX;

dwY = (DWORD)iY;

if (iMessage == 1)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MOVE,dwX,dwY,0,0);

}

else if (iMessage == 2)

{

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);

110

Page 117: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_LEFTDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_LEFTUP,dwX,dwY,0,0);

}

else if (iMessage == 5)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

}

else if (iMessage == 6)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);

}

else if (iMessage == 7)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MIDDLEDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_MIDDLEUP,dwX,dwY,0,0);

}

else if (iMessage == 8)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);

}

111

Page 118: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

else if (iMessage == 9)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);

}

else if (iMessage == 10)

{

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_RIGHTDOWN,dwX,dwY,0,0);

mouse_event(MOUSEEVENTF_ABSOLUTE|

MOUSEEVENTF_RIGHTUP,dwX,dwY,0,0);

}

}

else

{

fWMKeyBdMsg = FALSE;

for (iLoop = 0;iLoop < nWMKeyBdMsg;iLoop++)

{

if (strcmp(pCommandNode-

>Command.szElement,WMKeyBdMsg[iLoop].szWMKeyBdMsg) == 0)

{

fWMKeyBdMsg = TRUE;

if

(strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KD\0") == 0)

else if

(strcmp(WMKeyBdMsg[iLoop].szWMKeyBdMsg,"WM_KU\0") == 0)

112

Page 119: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

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);

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);

}

}

else

{

for (iLoop = 0;iLoop < nMsg;iLoop++)

{

if (strcmp(pCommandNode-

>Command.szElement,Msg[iLoop].szMsg) == 0)

{

if (strcmp(Msg[iLoop].szMsg,"WM_COMP\0") == 0)

113

Page 120: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

{

pCommandNode = pCommandNode->pNext;

iCompressionLevel = atoi(pCommandNode-

>Command.szElement);

}

else if (strcmp(Msg[iLoop].szMsg,"WM_GRID\0") == 0)

{

pCommandNode = pCommandNode->pNext;

nGridX = atoi(pCommandNode-

>Command.szElement);

pCommandNode = pCommandNode->pNext;

nGridY = atoi(pCommandNode-

>Command.szElement);

ClearDisplay(hServerWnd);

InitDisplay(hServerWnd);

}

else if (strcmp(Msg[iLoop].szMsg,"WM_CMOD\0") ==

0)

{

pCommandNode = pCommandNode->pNext;

bmBitsPixel = atoi(pCommandNode-

>Command.szElement);

ClearDisplay(hServerWnd);

InitDisplay(hServerWnd);

}

}

}

}

}

}

114

Page 121: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

Clear_Command(&CommandStart);

}

5.1.8 客 服 端 程 序

int LoadWinsock(HWND hWnd,char *szIP)

{

WSADATA wsd;

DWORD dwLen;

int nRet,nZero;

LPBYTE pBuf;

WSAPROTOCOL_INFO Protocol;

char szString[81];

char szMessage[81];

if (WSAStartup(0x202,&wsd) != 0)

{

MessageBox(NULL,"hehe","Client Socket Error",MB_OK);

return 1;

}

dwLen = 0;

nRet = WSAEnumProtocols(NULL,NULL,&dwLen);

if (nRet == SOCKET_ERROR)

{

if (WSAGetLastError() != WSAENOBUFS)

return 1;

}

115

Page 122: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

pBuf = malloc(dwLen);

nRet = SelectProtocols(SETFLAGS,NOTSETFLAGS,

(LPWSAPROTOCOL_INFO)pBuf,&dwLen,&Protocol);

free(pBuf);

sClient =

WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM)

;

if (sClient == INVALID_SOCKET)

return 1;

nZero = 0;

setsockopt(sClient,SOL_SOCKET,SO_RCVBUF,(char

*)&nZero,sizeof(nZero));

server.sin_family = AF_INET;

server.sin_port = htons(port);

server.sin_addr.s_addr = inet_addr(szIP);

if (connect(sClient,(struct sockaddr *)&server,sizeof(server)) ==

SOCKET_ERROR)

{

memset(szString,'\0',sizeof(szString));

sprintf(szString,"Connect() failed: %d",WSAGetLastError());

MessageBox(NULL,szString,"Client Socket Error",MB_OK);

return 1;

}

GetResolution();

116

Page 123: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

SetGrids(hWnd);

memset(szMessage,'\0',sizeof(szMessage));

sprintf(szMessage,"WM_COMP;%d;0;0;0;\0",iCompressionLevel);

SendCommand(hWnd,1,szMessage);

UpdateRegionalScreen(hWnd,sClient,TRUE);

return 0;

}

void SetGrids(HWND hWnd)

{

charszMessage[81];

Clear_Gdi(&GdiStart);

memset(szMessage,'\0',sizeof(szMessage));

sprintf(szMessage,"WM_GRID;%d;%d;0;0;\0",nGridX,nGridY);

SendCommand(hWnd,1,szMessage);

InitGrids();

}

void GetResolution()

{

int iSend,iRecv;

charszMessage[81];

charszRecv[81];

memset(szMessage,'\0',sizeof(szMessage));

sprintf(szMessage,"RESOLUTION\0");

iSend = Send(sClient,szMessage);

117

Page 124: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

王蓬超:远程桌面监控系统开发

iRecv = Recv(sClient,szRecv,80);

iWidth = atoi(szRecv);

memset(szMessage,'\0',sizeof(szMessage));

sprintf(szMessage,"OK\0");

iSend = Send(sClient,szMessage);

iRecv = Recv(sClient,szRecv,80);

iHeight = atoi(szRecv);

memset(szMessage,'\0',sizeof(szMessage));

sprintf(szMessage,"OK\0");

iSend = Send(sClient,szMessage);

}

int SendCommand(HWND hWnd,int iParm,char *szWMMessage)

{

int iSent;

if (iParm == 0)

{

UpdateRegionalScreen(hWnd,sClient,FALSE);

}

else if (iParm == 1)

{

iSent = Send(sClient,szWMMessage);

}

return 0;

}

int Send(SOCKET Socket,char *szSend)

118

Page 125: D4%B6%B3%CC%B…  · Web view四川理工学院毕业设计(论文) 远程桌面监控系统开发 学 生:王蓬超. 学 号:04101026135. 专 业:软件工程. 班 级:04级01班.

四川理工学院毕业设计(论文)

{

int iSent;

fSending = TRUE;

iSent = send(Socket,szSend,strlen(szSend),0);

fSending = FALSE;

return iSent;

}

int Recv(SOCKET Socket,char *szRecv,int iRecvLen)

{

int iRecv;

fReceiving = TRUE;

iRecv = recv(Socket,szRecv,iRecvLen,0);

if (iRecv == SOCKET_ERROR || iRecv == 0)

MessageBox(NULL,"NO DATA or SOCKET ERROR","Client",MB_OK);

szRecv[iRecv] = '\0';

fReceiving = FALSE;

return iRecv;

}

119