整体布局

  在远程协助中,请求协助的一方称为被协助方,或者(远程协助)服务端;响应的一方称为协助方,或者(远程协助)客户端;这里命名被协助方为Cv,而协助方命名为Cs,中转服务器为Sr。

  TightVNC是免费为个人和商业用途,提供有用的,完整的源代码, 在管理,技术支持,教育和许多其他用途, 跨平台,可用于Windows和Unix,Java客户端,包括 与标准的VNC软件兼容,符合RFB协议规范。

TightVNC 分为Server和 Viewer两部分,Server作为请求协助端,Viewer协助端亦即是Cs和Cv 。

  Repeater为中转服务器Sr,当Server连接Viewer是,通过Sr相互转发数据。对Cs的监控端口为5500,Cv的监控端口为5900,当然5500、5900都是vnc的默认端口,这样会引起其他一些VNC软件的冲突,所以Cs和Cv监控端口都需要修改。

整个设备架设可简化为如图1所示,分为情况

1)     协助用户Cv和请求协助用户Cs1在同一局域网内,这时Cv与Cs1可以直接进行TCP通信;

2)     协助用户Cv和请求协助用户Cs2不在同一局域网内,这时Cv与Cs2只能通过中转服务器相互转发数据进行通信。

整体布局

流程图

一、被协助用户Cs请求协助用户Cv的协助过程流程图如图2所示;

Cs请求Cv协助过程流程图

1)     被协助者

  1. 用户界面操作响应,向在线用户发送1301请求(远程协助请求)。
  2. 1301-Confirmation消息处理:

如果对方拒绝接受请求,显示信息窗口,提示“远程请求被对方拒绝”。

如果对方接受请求,则创建远程协助对象;是否允许对方查看,调用远程协助对象的StartServer,参数为对方用户ID。

申请受控请求

2)     协助者

  1. 处理1301-Request消息。

窗口提示用户“xxxx发出远程协助邀请,您是否同意?”;如果“同意”则创建远程协助对象,调用远程协助对象Connect方法,连接对方的IP以及Port,建立TCP连接。调用用远程协助对象的SetHost(),参数为用户自己ID。

  1. 处理申请受控消息。

调用用远程协助对象的SetViewOnly(),参数为false;远程协助建立成功。

双方通过中转服务器或者直接建立TCP连接,完成远程协助以及数据交互。

二、Server两种请求协助方式Connect和Listen

1)     在局域网中Server端和 Viewer端如果能够直接进行TCP通信的时,这时就不需要通过中转服务器,Viewer直接连接Server。流程图如图3所示

Cv与Cs直接进行TCP通信流程图

2)     当Server端和 Viewer端不能直接的TCP通信时,亦就可能是在两个不同的局域网中,这时就需要通过中转服务器Repeater进行Server端和 Viewer端的消息转发。流程图如图4所示

Cv与Cs通过Repeater通信流程图

远程协助插件设计方案

将Server和 Viewer封装在两个动态库中,分别为RemoteHelpServer和RemoteHelpViewer,外部调用RemoteHelpServer和RemoteHelpViewer时,应为单实例调用,即是已经作为一个客户端或者是服务器端时,不能再与其他人进行远程协助。

外部接口包括:连接方式、调节画面质量、画面模式和协助方式等

  1. 连接方式:Viewer直连Server和通过Repeater与Server通信;
  2. 调节画面质量:1-9级别的lpeg图像压缩;
  3. 画面模式:8位和24位画面质量;
  4. 协助方式:仅屏幕查看和邀请方请求受控;
  5. 远程协助窗体模式:最大化,还原和最小化;
  6. 快捷键:Shift+Ctrl+Alt+F 全屏、ESC退出全屏。

RemoteHelpServer和RemoteHelpViewer动态库接口函数说明

Server端接口函数:

//参数:无

//返回值:Server端实例指针

//作用:创建远程协助Server端实例

RemoteHelpHandle *CreateRemoteHelpServer();

//参数:Server端实例指针

//返回值:无

//作用:销毁远程协助Server端实例

void DestoryRemoteHelpServer(RemoteHelpHandle *handle);

//参数:Server端实例指针,中转服务器IP及端口号

//返回值:成功时返回Socket指针

//作用:Server连接中转服务器

SocketIPv4 *ServerConnect(RemoteHelpHandle *handle,TCHAR *host,unsigned short port);

//参数:Server端实例指针,监听端口号

//返回值:成功时返回Socket指针

//作用:Server监听

SocketIPv4 *ServerListen(RemoteHelpHandle *handle,unsigned short port);

//参数:Server端实例指针,Socket指针,是否作为服务监听状态

//返回值:0,1

//作用:Server确认Viewer可以查看

int AddNewConnection(RemoteHelpHandle *handle,SocketIPv4 *socket,bool bIsListenMode);

//参数:Server端实例指针,连接凭证

//返回值:无

//作用:Server连接凭证

void SetServerConnectionTag(RemoteHelpHandle *handle,char *pszConnectionTag);

//参数:Server端实例指针

//返回值:无

//作用:Server端断开连接

void ServerDisconnect(RemoteHelpHandle *handle);

Viewer端接口函数:

//参数:无

//返回值:Viewer端实例指针

//作用:创建远程协助Viewer端实例

RemoteHelpHandle *CreateRemoteHelpViewer();

//参数:Viewer端实例指针

//返回值:无

//作用:销毁远程协助Viewer端实例

void  DestoryRemoteHelpViewer(RemoteHelpHandle *handle);

//参数:Viewer端实例指针,中转服务器IP及端口号

//返回值:关闭窗体时返回true,其它为false

//作用:Viewer连接中转服务器

bool  ViewerConnect(RemoteHelpHandle *handle,char *host,int port);

//参数:Viewer端实例指针,中转服务器IP及端口号

//返回值:关闭窗体时返回true,其它为false

//作用:Viewer连接中转服务器

void  SetViewerConnectionTag(RemoteHelpHandle *handle,char *pszConnectionTag);

//参数:Viewer端实例指针,是否使用8Bit

//返回值:无

//作用:远程协助图像质量,两种情况8Bit,24Bit

void  Set8BitColor(RemoteHelpHandle *handle,bool use8Bit);

//参数:Viewer端实例指针,压缩率级数

//返回值:无

//作用:远程协助图像压缩率

void setJpegCompressionLevel(RemoteHelpHandle *handle,int level);

//参数:Viewer端实例指针, 是否为只查看

//返回值:无

//作用:设置远程协助只查看或可控

void setViewOnly(RemoteHelpHandle *handle,bool viewOnly);

//参数:Viewer端实例指针, 是否为全屏

//返回值:无

//作用:设置远程协助窗体为全屏或退出全屏

void setFullScreenMode(RemoteHelpHandle *handle,bool fullScreenMode);

//参数:Viewer端实例指针

//返回值:无

//作用:Viewer端断开连接

void ViewerDisconnect(RemoteHelpHandle *handle);

程序界面

一、远程协助握手过程窗体界面显示:

请求远程协助

Viewer接受远程协助,等待确认Server确认查看

Server确认查看

Server已申请受控

二、客户端Cv:如图5所示,连接成功后分别有属性设置、最大化、断开等按钮;左下方为显示图像面板。

客户端Cv

三、属性设置:如图6所示,调节画面质量:1-9级别的lpeg图像压缩;画面模式:8位和24位画面质量

属性设置

四、客户端Cs:如图7所示,连接成功后,可以断开远程控制或者停止受控等操作。

客户端Cs

五、远程协助窗体:窗体模式分别有最大化,还原和最小化;快捷键分别有Shift+Ctrl+Alt+F 全屏、ESC退出全屏。当窗体最大化即全屏时,顶部出现工具条,可以控制窗体最大化,还原和最小化等操作,如图8所示,

远程协助全屏模式

 注: 

  在这个功能刚开始做的时候,google 、百度了很多这方面的资料,无奈资料还是比较少的。其中有一篇论文《基于P2P的远程协助系统》,写得比较详细的方案,但最终没有实现P2P的方法,可能是一开始就走了弯路和现成的系统限制了,时间方面不允许和稳定性。

  《基于P2P的远程协助系统》里面写是通过本地代理,中转服务器建立桥梁实现远程协助通信。其中本地代理可以不管VNC里面代码的逻辑具体实现,只是负责通信,对远程协助与VNC版本轻松解耦,没有依赖VNC版本,可以不断地使VNC更新换代有重要意义。还有一个作用是可以TCP打洞实现P2P《TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞》,不依赖VNC内部发送规则。

  《TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞》一文中这位前辈写TCP实现P2P的方法,我想这对一些刚开始做TCP实现P2P通信有很大的帮助,感谢他的分享的精神,至少我对TCP实现P2P通信有所了解了。他所说的实现过程如下

  1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。
  2、 A和B分别与S的【主连接】保持联系。
  3、 当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。
  4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。
  5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。
  6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接(例如我用的TPLink R402),大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和端口号,为接下来真正的连接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。
  7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。
  8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。

  整个过程跟UDP打洞很类似,我认为他文中写可能是没有注重的写出一个重点,就是“Sock.SetSockOpt ( SO_REUSEADDR, &nOptValue , sizeof(UINT) )”其中的SO_REUSEADDR,因为这样以上的过程才能够实现。

  还有在OSChina里的一个讨论贴“C++实现TCP打洞的思想”,有些人说的tcp打洞无法实现,那些人我认为是根本没有去了解过吧,而且QQ的远程协助是TCP连接的,难道QQ的远程协助都是经服务器转发的?

  知识有限,基本上想说的都说了!

  

转载于:https://www.cnblogs.com/janko208/archive/2012/03/29/2424045.html

基于Tight VNC的远程协助功能的实现相关推荐

  1. QQ怎么服务器远程,腾讯QQ远程协助功能详解

    使用过 Netmeeting 的朋友都会为对其远程桌面共享功能印象颇为深刻.的确,远程共享可以为我们提供很大的方便,但是由于建立互联需要 IP 地址的呼叫,服务器也不是分稳定.大多数人恐怕都有过因为找 ...

  2. 璞华大数据HawkEye设备数字化管理之远程协助功能

    应用背景 对于设备制造厂商或者设备使用企业而言,在日常的设备维修管理过程中,多长时间到达现场和多长时间排除故障,是考核工厂维修工和售后维修人员工作绩效的重要指标. 在设备专业程度和精密度不断提高以及国 ...

  3. 计算机属性中只有远程协助,使用Windows自带的远程协助功能解决电脑问题

    一.Windows7 版本 第一步 确认您计算机可以接受远程协助,打开"计算机"属性,远程选项 确保"允许远程协助连接这台计算机"选项是被勾选的. 第二步 生成 ...

  4. QQ远程协助没动静?QQ版本有讲究

    一位网友觉得电脑反应速度慢了,想通过QQ远程协助让我处理一下.不料接受请求后,等了许久都显示网友电脑的桌面,而网友那边QQ也没有任何提示. 反复尝试了几次都是如此. 询问网友得知他用的QQ为2011版 ...

  5. 象过河怎么用远程服务器,象过河远程协助的教程

    完美者(wmzhe.com)网站以软件下载为基础,改版后的网站对功能性板块进行扩充,以期能够解决用户在软件使用过程中遇见的所有问题.网站新增了"软件百科"."锦囊妙技&q ...

  6. 企业网远程协助的小能手

    Dec 29.2010 在Windows系统里,有许多系统自带的工具软件,以其精简的外表.全面的功能,盛行于管理领域,但却被大多数所忽略,例如:磁盘碎片整理&磁盘整理,许多人乐于使用Windo ...

  7. QQ“远程协助”文字输入技巧

    当QQ聊友遇到问题无法解决时,QQ"远程协助"功能为你提供了一个协助对方解决问题的途径.但是,在通过远程协助控制了对方的电脑时,是不是会遇上无法在对方电脑输入字符和文字的情况呢?其 ...

  8. 桌面虚拟化之远程协助

    前言:最近桌面虚拟化如火如荼,很多企业都在考虑桌面虚拟化,但是也很担 心桌面虚拟化的维护性是否简易? 其实有这种担心也是人之常情,在PC时代,基本上每个企业都有几个维护人员,而 且大型的公司基本上采取 ...

  9. VMware Horizon虚拟桌面工具箱之审计与远程协助

    VMware Horizon产品提供了业界领先的虚拟桌面服务,安全.便利.高效,正逐渐成为下一代企业桌面的最佳选择.今天,我们向大家推荐一款由VMware公司开发的"Horizon工具箱&q ...

  10. 怎么设置锤子手机显示无服务器,锤子手机远程协助怎么使用 锤子手机远程协助使用教程【详解】...

    最近,锤子科技向锤子手机用户推送了全新的Smartisan OS 2.5版本.该版本除了对已知的一些bug进行修复之外,也带了全新的:远程协助功能.那么,锤子手机远程协助怎么使用呢?今天,小编就给大家 ...

最新文章

  1. 设置显示Git的修改历史History快捷键Alt+H,方便多人开发的时候快速查看谁修改了代码
  2. 11大改革举措!国家自然科学基金2021年项目指南发布
  3. swagger2 集成无效_Springboot2 集成Swagger2,解决配置完成后不显示的坑
  4. Boost:bind绑定__cdecl(成员函数)测试程序
  5. php中preg_match用户名正则实例
  6. 一个天才程序员的黑帮大佬人生
  7. IEnumerable
  8. 梯度下降法理论与实践
  9. 1000个脑筋急转弯
  10. 《HBase权威指南》读书笔记6:第六章 可用客户端
  11. 微信小程序编辑与显示列表信息
  12. matlab的机器学习工具箱在哪,[matlab]机器学习及SVM工具箱学习笔记
  13. 什么软件能测试显卡功耗,如何在win10中检查计算机的显卡功耗
  14. 如何破解加密相册密码四大方法
  15. InnoDB存储引擎介绍-(6) 一. Innodb Antelope 和Barracuda区别
  16. 三次方程求根公式例子
  17. Cygwin——简介
  18. 上海浦东机场的wifi使用攻略
  19. Q/W防洪跳转页面/微信小程序跳转到未备案域名
  20. springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)

热门文章

  1. 自定义表单-列表字段的数据源绑定
  2. SQL Server 2008数据库快照技术(八)
  3. spring中的BeanFactory和FactoryBean的区别与联系
  4. Hive2.0中HiveServer2的WEB UI界面
  5. Spring 官方又孵化了个顶级项目,或将改变前后端API现状!
  6. 图解 MySQL 索引,写得实在太好了!
  7. 对 Java 意义重大的 7 个性能指标
  8. 二货同事!写上千行的类!这样的代码让我生不如死!
  9. 2017年最受欢迎的10个编程挑战网站,值得收藏!
  10. 35+ 个 Java 代码性能优化总结