VNC源码阅读--VNC图像更新机制

TightVNC二次开发(2) 远程控制功能实现与优化 本文深入探讨了TightVNC二次开发中远程控制功能的核心实现与优化。通过剖析RFB协议通信机制,详细介绍了从搭建开发环境、实现基础控制循环,到图像渲染、事件传递等核心功能的代码实践。重点分享了自适应编码、网络重连、性能调优等关键优化策略,旨在帮助开发者构建更稳定、高效的远程控制解决方案。 阅读详情

VNC源码阅读--VNC图像更新机制  


VNC的图像更新机制核心为,桌面区域更新记录策略和更新区域通知策略。桌面更新区域记录主要是通过hooks记录桌面上变化的矩形区域,只记录更新的矩形区不记录具体更新的数据。更新区域记录步骤大致如下:1.wm_hooks截获桌面变化的相关消息,并转化为自定义的消息发送给WMHooksThread线程处理。 2. WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域.3.把SimpleUpdateTracker new_changes更新拷贝到SDisplay中。4.每次要发送桌面更新的时候,把SDisplay中记录的更新区域传给VNCServerST 对象中。更新区域的通知主要有poll和push两种机制。push是服务器每隔10ms检查有没有更新,如果有更新则主动把更新推送给客户端,poll机制则是客户端主动请求更新,客户端通过发送framebufferupdate请求某一个区域更新,服务器处理该消息发送相应的更新。详细分析如下:

1.Wm_hooks截获消息并转化为自定义的消息发送给WMHooksThread线程处理。

Wm_hooks自定义的消息:

UINT WM_HK_WindowChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowChanged"));

UINT WM_HK_WindowClientAreaChanged = UINT WM_HK_WindowBorderChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowBorderChanged"));

UINT WM_HK_RectangleChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.RectangleChanged"));

UINT WM_HK_CursorChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.CursorChanged"));

钩子截获到消息以后,把它转化为自定义的消息,然后发送给WMHooksThread线程处理,消息转化如下:

边框更新消息:WM_NCPAINT,WM_NCACTIVATE

客户区域更新消息:BM_SETCHECK, BM_SETSTATE,EM_SETSEL,WM_CHAR,WM_ENABLE,WM_KEYUP,WM_LBUTTONUP,WM_MBUTTONUP,WM_PALETTECHANGED,WM_RBUTTONUP,WM_SYSCOLORCHANGE,WM_SETTEXT。

窗口改变消息:WM_HSCROLL,WM_VSCROLL,482,485。

矩形区更新消息:WM_DESTROY

窗口客户区消息:WM_PAINT

鼠标消息:WM_NCMOUSEMOVE,WM_MOUSEMOVE

2 . WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域

WMHooksThread::run() 函数中先判断出矩形区域改变的大小,然后调用NotifyHooksRegion(const Region& r)把改变的区域记录到SimpleUpdateTracker new_changes中。

NotifyHooksRegion(const Region& r) {

Lock l(hook_mgr_lock);

std::list<WMHooks*>::iterator i;

for (i=hooks.begin(); i!=hooks.end(); i++) {

    (*i)->new_changes.add_changed(r);

    if (!(*i)->notified) {

      (*i)->notified = true;

      PostMessage((*i)->getHandle(), WM_USER, 0, 0); // 把消息通知到clipper见下面一个处理函数

    }

}

}

3.把更新区域拷贝到SDisplay中

rfb::win32::WMHooks::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {

switch (msg) {

case WM_USER:

    {

      Sleep(0);

      Lock l(hook_mgr_lock);

      notified = false;

      new_changes.get_update(*clipper); //把更新通知到clipper中

      new_changes.clear();

    }

    break;

}

return MsgWindow::processMessage(msg, wParam, lParam);

}

Cliper在下面设置

rfb::win32::WMHooks::setUpdateTracker(UpdateTracker* ut) {

if (clipper) delete clipper;

clipper = new ClippedUpdateTracker(*ut);

clipper->set_clip_region(clip_region);

return AddHook(this);

}

UpdateTracker* ut 为void SDisplay::start(VNCServer*vs)中设置 core->using_hooks = core->wm_hooks.setUpdateTracker(this);

4.把SDisplay中记录的数据传给VNCServerST 对象

在 SDisplay::processEvent(HANDLE event) {

try_update = flushChangeTracker() || try_update; //把变化的区域拷贝到VNCServerST中

      if (try_update)

        server->tryUpdate();          //把更新发送给服务器

}

flushChangeTracker()实现如下:

bool SDisplay::flushChangeTracker() {

if (change_tracker.is_empty())

    return false;

change_tracker.translate(screenRect.tl.negate());

change_tracker.get_update(*server); //server 实际指向VNCServerST 对象该函数把SDisplay中的更新拷贝到VNCServerST中。

change_tracker.clear();

return true;

}

两种数据更新方式:Push机制和Pull机制

Push:

SdisplayCore 中IntervalTimer cursorTimer定时器,每隔10ms尝试着检查一下是否有更新,如果有更新就发送更新给客户端。

第一步:

LRESULT SDisplayCore::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) {

case TIMER_CURSOR:

     display->triggerUpdate(); //SDisplay* display;

}

第二步:

void SDisplay::triggerUpdate() {

     if (core)

         SetEvent(updateEvent); //使事件对象为受信状态

}

第三步:

SDisplay::processEvent(HANDLE event) {

     if (event == updateEvent) {

         if (try_update)

                   server->tryUpdate(); // VNCServer* server指针 指向子类VNCServerST

}

}

第四步:向每一个连接的客户端发送更新

void VNCServerST::tryUpdate()

{

     std::list<VNCSConnectionST*>::iterator ci, ci_next;

     for (ci = clients.begin(); ci != clients.end(); ci = ci_next) {

         ci_next = ci; ci_next++;

         (*ci)->writeFramebufferUpdateOrClose();

     }

}

第五步:

void VNCSConnectionST::writeFramebufferUpdateOrClose()

{

     try {

         writeFramebufferUpdate();

     } catch(rdr::Exception &e) {

         close(e.str());

     }

}

第六步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新

void VNCSConnectionST::writeFramebufferUpdate(){

if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) {

         int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0);

         writer()->writeFramebufferUpdateStart(nRects);

         Region updatedRegion;

         writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter *

         updates.subtract(updatedRegion);

         if (drawRenderedCursor)

              writeRenderedCursorRect();

         writer()->writeFramebufferUpdateEnd();

         requested.clear();

     }

}

第七步:利用RFB协议发送更新

void SMsgWriterV3::writeFramebufferUpdateStart(int nRects)

{

     startMsg(msgTypeFramebufferUpdate);

     os->pad(1);

     if (wsccb) nRects++;

     if (needSetDesktopSize) nRects++;

     os->writeU16(nRects);

     nRectsInUpdate = 0;

     nRectsInHeader = nRects;

     if (wsccb) {

         wsccb->writeSetCursorCallback();

         wsccb = 0;

     }


VNC源代码下载 - 搜珍网 Virtual Network Computing(VNC)是一种用于远程控制计算机的开源软件,它允许用户通过网络远程访问和操作其他计算机。VNC将显示屏的图像和输入设备的动作传输到远程计算机,并将远程计算机的响应传回本地计算机,从而实现了远程控制。通过分析这些源代码,并结合官方文档和其他资源,开发人员可以进一步学习和掌握VNC的工作原理,从而灵活运用VNC进行远程控制、远程协助等应用场景的开发。在搜珍网可以找到多个版本的VNC源代码下载,以供开发人员学习和使用。开发人员可以根据需求自定义更多功能。 阅读详情

相关推荐

VNC VC++完整源代码

VNC vc++完整源代码,如果你想研究VNC又苦于找不到源代码,本资源能提供给你很好的帮助

VncServer源码,vncserver源码安装,C#源码.zip

VncServer源码,vncserver源码安装,C#源码

vnc源码以及详细分析

vnc源码以及详细分析,附带win32的源代码,以及代码中的详细注释分析。

VncServer源码,vncserver源码安装,C#

C#开发的VNC源码,非标准VNC协议。需要配合对应的客户端应用

nova vnc proxy基本原理

先上图 VNC Proxy的功能: 将公网(public network)和私网(private network)隔离VNC client运行在公网上,VNCServer运行在私网上,VNC Proxy作为中间的桥梁将二者连接起来VNC Proxy通过token对VNC Client进行验证VNC Proxy不仅仅使得私网的访问更加安全,而且将具体的VNC Server的实现分

刘超的通俗云计算 2627

VNC源码阅读笔记

VNC源码阅读笔记 我阅读的是VNC官方下载的4.1.3版本的源码。下面是Windows版本的VNC客户端源码阅读笔记。 while (!hosts.empty()) { ...

weixin_33827731的博客 265

VNC源码阅读--VNC图像更新机制(1)

VNC源码阅读--VNC图像更新机制(1) VNC图像更新机制核心为,桌面区域更新记录策略和更新区域通知策略。桌面更新区域记录主要是通过hooks记录桌面上变化的矩形区域,只记录更新的矩形区不记录具体更新的数据。更新区域记录步骤大致如下:1.w...

weixin_33725722的博客 326

WINVNC源码阅读(五)

VNC图像更新机制 VNC图像更新机制核心为,桌面区域更新记录策略和更新区域通知策略。桌面更新区域记录主要是通过hooks记录桌面上变化的矩形区域,只记录更新的矩形区不记录具体更新的数据。更新区域记录步骤大致如下:1.wm_hooks截获桌面变化的相关消息,并转化为自定义的消息发送给WMHooksThread线程处理。 2. WMHooksThread 中用SimpleUpdateTrac

XXX的专栏 1031

tightVNC远控源码分析v1.3

WinVNC模块: 一。WinMain函数 1.初始化VSocketSystem套接字,初始化化log为winvnc.log文件,转换命令行参数为小写,解析命令行参数。没有命令行参数则进入WinVNCAppMain。 在函数WinVNCAppMain中:设置进程为关机时最后关闭。创建全局锁,确定只有一个进程实例在运行。 2.vncServer初始化:初始化成员变量,清空密码。如果版本大于4...

研究源码的最底层,只持有正确的仓位 2661

远程控制VNC的精典源码

远程控制VNC的精典源码,网上下的,拿出来分享,可供朋友学习远程控制的原理。

vnc远程控制系统源代码

VNC软件主要由两个部分组成:VNC serverVNC viewer。用户需先将VNC server安装在被控端的计算机上后,才能在主控端执行 VNC viewer 控制被控端。

经典的远程控制软件VNC(Virtual Net Computer)源代码

经典的远程控制软件VNC(Virtual Net Computer)源代码

rMview性能优化终极指南:降低延迟、提升帧率与高效内存管理的10个技术细节

rMview是一款专为reMarkable电子纸平板设计的**实时屏幕查看器**,通过PyQt5技术栈实现高效流畅的远程显示体验。本文将深入探讨rMview性能优化的关键技术细节,帮助用户获得更低的延迟、更高的帧率和更优的内存管理效果。无论您是新手用户还是技术爱好者,这些优化技巧都能显著提升您的使用体验。 ## 🔍 rMview性能瓶颈分析 在开始优化之前,我们先了解rMview可能遇到的性

gitblog_00577的博客 742

Android设备远程控制深度实践:droidVncServer技术架构与实现方案

droidVncServer作为一款专业的Android VNC服务器解决方案,为开发者提供了完整的Android设备远程控制能力。通过深入分析其技术架构和实现原理,我们可以了解如何实现高效的Android远程屏幕捕获、输入事件注入和跨平台VNC协议支持。本文将深入探讨droidVncServer的核心技术实现,为开发者提供实用的技术参考和优化建议。 ## 技术架构解析:多模块协同的Androi

gitblog_00725的博客 691

【亲测免费】 QtEmu 开源项目安装与使用教程

QtEmu 开源项目安装与使用教程 概览 QtEmu 是一个基于 Qt4 的 QEMU 图形界面前端,允许用户在本地系统上轻松运行虚拟操作系统,比如测试新系统或体验 Live CD,而无需承担风险。尽管此项目标记为未维护状态,但存在活跃的分支 MateuszKrawczuk/QtEmu,支持更现代的环境。 本教程将指导您了解 QtEmu 的基本结构、启动文件以及配置相关知识。 1. 项目目录结构...

gitblog_01148的博客 1137

TigerVNC远程桌面客户端:跨平台高效连接的终极完整指南

想要在不同操作系统之间实现稳定流畅的远程桌面连接吗?TigerVNC作为一款高性能、跨平台的VNC客户端和服务器软件,能够为您提供卓越的远程访问体验。本指南将详细介绍如何快速部署和使用TigerVNC远程桌面客户端,让您轻松管理Windows、Linux和macOS系统。 ## 🚀 TigerVNC的核心优势 TigerVNC是一个开源的远程桌面系统,基于VNC(Virtual Networ

gitblog_00294的博客 947
上一篇: WINVNC源码分析(四)-vnchooks
下一篇: VNC源码阅读笔记
弹琴小虎
博客等级 码龄17年 25粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值