当前位置:首页 > 代码 > 正文

vnc远程控制源代码(远程桌面 vnc)

admin 发布:2022-12-19 16:49 163


今天给各位分享vnc远程控制源代码的知识,其中也会对远程桌面 vnc进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

请问有谁知道VNC软件的源代码?

vnc win-hook + event-simulate + gdi-bitmap-capture(delay send) + libjpeg + socket ******************************************************************************************************************* 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::listWMHooks*::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::listVNCSConnectionST*::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; } } Poll机制:客户端通过发送更新请求,请求更新某一个区域。 第一步:读取到一个更新某一个区域的请求 void SMsgReaderV3::readMsg() { case msgTypeFramebufferUpdateRequest: readFramebufferUpdateRequest(); break; } 第二步:调用网络事件处理对象handler处理事件 void SMsgReader::readFramebufferUpdateRequest() { bool inc = is-readU8(); int x = is-readU16(); int y = is-readU16(); int w = is-readU16(); int h = is-readU16(); endMsg(); handler-framebufferUpdateRequest(Rect(x, y, x+w, y+h), inc);//handler 为 SMsgHandler* handler指针 是指向VNCSConnectionST对象 } 第三步: void VNCSConnectionST::framebufferUpdateRequest(const Rect r,bool incremental) { if (!(accessRights AccessView)) return; SConnection::framebufferUpdateRequest(r, incremental); Region reqRgn(r); requested.assign_union(reqRgn); if (!incremental) { updates.add_changed(reqRgn); server-comparer-add_changed(reqRgn); } writeFramebufferUpdate(); } 第四步: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来远程控制管理服务器

虚拟远程计算(VNC)是一个远程管理工具,它受到了许多IT专业人员了青睐。这里我们要介绍如何配置TightVNC,以实现远程系统的安全访问,TightVNC也就是VNC的加强版本。现在已有不计其数的远程管理和连接工具,都是为了帮助技术员和IT管理员检修、维护和访问其他地方的系统。其中一些简单易用,无须设置防火墙。另一些则虽然提供了更多高级功能,但需要购买昂贵的许可证,这无疑打击了用户的使用积极性。VNC作为一款优秀的远程管理工具,一般是IT专业人员理所当然的选择。在它早先的几个版本中,VNC采用了一种简单、相对直接的实现方式,而且对于访问远程系统,它的实施难度可承受 ,安全性能较理想。光阴如梭,开放源代码社区(the open source community)也不断地改善着这个远程访问工具。尤其是作为其开发者的Constantin Kaplinsky公司,它维持有一项工程,致力于开发一个可以克服VNC不足的改进版VNC远程管理工具。结果就产生了这一款更神通广大的应用程序,唤名TightVNC。哪里可以获得TightVNC一方面,TightVNC在宣传中称自己是操作平台不依赖的客户端/服务器双重安装包,能够远程访问图形桌面;另一方面,TightVNC又是一款免费软件,企业完全可以用之解决远程连接的需求。它的发布方式采用GNU通用公共授权。自安装Windows程序包可到SourceForge.net网下载。Linux、 UNIX,及Java(只有查看器)的版本也都有提供。TightVNC的改进TightVNC比之标准的VNC,其中的一个提高是增加了从本地系统向远程工作站(按照VNC的说法,也就是指服务器端)传送文件的功能,反之亦可;并且采用了可调等级的压缩方案,以更好的适应连接速度,使通过远程连接执行的工作能够顺利完成。其他改进还包括鼠标事件处理的改善(鼠标移动均本地处理,以防性能问题)、针对较慢网络连接的优化、JPEG图片的压缩以实现更佳的显示性能、网络浏览器的改进使之支持高达24-位颜色的模式、通过使用双重密码(其一用于完全控制,另一则只能进行只读访问)使安全更加密不透风,还有,对于UNIX系统它会自动采用SSH加密的连接。TightVNC的安装要在你希望远程访问的工作站或服务器上安装TightVNC,首先得下载自安装的TightVNC程序包。安装程序(自本文写作时当前版本是tightvnc-1.2.9-setup.exe)准备好了之后,按以下步骤进行:1.双击此可执行文件。出现“欢迎使用TightVNC”(Welcome To TheTightVNC)安装向导。点击“下一步”(Next)。

2.查看GNU通用公共授权的条款,点击下一步,表示同意接受那些条款。

3.指定安装路径并点击下一步。

4.指定须完全安装、最小化安装还是自定义安装。在本例中,我们接受默认设定,进行完全安装,点击下一步。

5.指定是否让安装程序创建开始菜单文件夹,并给定希望使用的文件夹名称,然后点击下一步。

6.配置附加设置。默认情况下.vnc文件和TightVNC查看器关联。如果你想让系统作为一个VNC服务器,或者叫主机系统,则勾选“把TightVNC服务器端注册为系统服务”(Register TightVNC Server as a system service)。然后点击下一步。出现准备安装屏幕(Ready To Install Screen)(图A)。图A TightVNC安装程序允许在安装过程中把TightVNC服务器端注册为一个系统服务。7.点击“安装”(Install)执行TightVNC的安装。程序便自己开始安装,你可以看到完整的安装过程。

8.点击“完成”结束安装。如果系统配置成作为远程连接的服务器或者主机,重新启动Windows可能是需要的。TightVNC主机的配置TightVNC安装好之后,应按以下步骤配置主机系统:1.确保TightVNC已设置成作为系统服务启动。这样才能保证万一你需要远程连接时TightVNC是活动的,即使没有用户在场或者坐在远程工作站旁也没关系。如上所示,可以在安装时选中“把TightVNC服务器端注册为系统服务”选项。2.为TightVNC会话设置密码。你可以双击Windows系统托盘中的VNC图标,在“当前用户属性”(Current User Properties)对话框的“客户端接入连接”(Incoming Connections)框中指定密码(图B)。图B 使用VNC的当前用户属性对话框配置连接选项。3.点击“WinVNC:当前用户属性对话框”的“高级”(Advanced)按钮配置其它设置,如是否禁止使用空密码,是否允许绕回连接(loopback connection),以及是否把会话信息记录为WinVNC的日志文件。按照自己的需要配置好之后,点击“应用”(Apply),然后点击“确定”(OK)关闭所有打开的窗口(图C)。图C 高级TightVNC连接选项通过当前用户高级属性菜单进行配置。3.确保Window防火墙(以及其它任何基于软件和硬件的防火墙)已经配置成允许TightVNC访问网络。在Windows系统中,点击 开始|控制面板|Windows防火墙,然后选择“例外”(Exceptions)选项卡。确保WinVNC选择框被打勾;否则,Windows防火墙会阻止你的连接尝试。对于某些其它防火墙,5900端口可能是激活VNC正常通信所必需的。(其它VNC功能有时使用5500和5800端口。)为了获得最好的安全性,管理员应对配置进行测试,找出在特定的环境下可以允许正常连接的最少端口开启个数。连接TightVNC主机连接准备好的远程主机需要在本地系统中安装TightVNC,并按如下过程操作:1.在本地系统中打开一个TightVNC查看器,方法是点击 开始|所有程序|TightVNC|TightVNC查看器。“连接详情”(Connection Details)窗口将会显示(图D)。输入要连接的远程VNC服务器名称。如果你更改了默认端口,你需要指定新的端口,格式是:192.168.1.1:9500。图D 在“连接详情”屏幕上输入希望连接的远程系统的IP地址。2.点击“选项”(Options)配置其它设置。“连接选项”对话框弹出(图E)。配置好任何需要的选项(如隐藏远程鼠标、 在较慢的网络中限制像素为8位),然后点击“确定”(OK)。此时你回到“连接详情”屏幕。点击“确定”连接远程系统。图E 在对话框中配置连接选项3.输入在远程系统的“WIinVNC:当前用户属性”中设定的会话密码并点击确定。接着,远程系统的桌面便将在本地系统上显示,至此,使用本地工作站或服务器查看和配置远程系统也得以实现(图F)。图F 只要输入正确的会话密码,远程工作站的桌面便在本地系统上显示。

请问谁知道哪里有远程控制软件VNC的源码?

vnc的源码安装与使用!!!

VNC的原码安装与使用

下载VNC Server与VNC viewer.

VNC Server下载地址:

VNC viewer下载地址:

文章分为两部分:1〉被控端 Redhat A3 主控端Windows 2000

2〉被控端 Windows 2000 主控端Redhat A3

一、被控端 Redhat A3 主控端Windows 2000

1.安装vnc-3.3.7-x86_linux.tar.gz

t ar -zxvf vnc-3.3.7-x86_linux.tar.gz

cd vnc-3.3.7-x86_linux

./vncinstall /usr/bin /usr/local/share/man #前一个路径是vnc的执行文件路径(可更改) 后一个是vnc man的安装路径

安装winvnc.exe

2.在Linux上启动VNC Server

执行vncserver命令:

[root@linux root]# vncserver

You will require a password to access your desktops.

Password: ----为了不想任何人都可以任意遥控此计算机。因此当第

Verify: ---1次启动VNC server时,会要求设置网络遥控的密码。

New ‘X’ desktop is linux:1 ----一定要记住这一行稍后会用到。

Creating default startup script /root/.vnc/xstartup

Starting applications specified in /root/.vnc/xstartup

Log file is /root/.vnc/linux:1.log

(经上述步骤后,便已启动了VNC Server。如果你想要更改VNC Server的密码,只要执行vncpasswd命令即可。)

3.在Microsoft Windows上运行VNC Viewer

直接运行“vncviewer.exe”,系统会出现”Connection details”对话框。

在“Connection details”对话框中的“VNC server”文本框中输入VNC Server的IP地址(或主机名及显示装置编号,(请看3。在Linux上 启动VNC server的这一行,New ‘X’ desktop is linux:1 得到此信息),例如:192.168.0.1:1(冒号后面的1是执行VNC Server生成的 显示装置编号),

如图1

单击“OK”按钮后,VNC Server即会开始检查所输入的信息,若是信息错误,系统会出现“Failed to connect to server ”的错误信息:如图2

若是信息正确,则会接着出现“VNC Authentication”对话框。如图3

若是在“VNC Authentication”对话框中输入的密码正确,就可以成功地打开Linux的桌面窗口。如图4

4. 从浏览器远程遥控。

启动VNC Server 后直接打开浏览器,在地址栏中输入被控端的网址或IP地址,并在网址后加上“:5800+显示编号”的端口号即可操控该计 算机。

如图5

例如: (如果显示编号为1,一般第一次设置的显示编号都是1,就用5800+1=5801。)

如图6

如图7

5.vnc默认连接的TWM桌面,可以修改/root/.vnc/xstartup文件,更改连接的桌面。把最后一行 twm 改成 gnome-session or kde

二、被控端 Windows 2000 主控端Redhat A3

1.在windows 2000 中运行vnc server ,起来之后右键点击vnc server的图标--〉properties 出现vnc server 的属性配置界面。

如图8

在password后输入自己的密码,并把Auto的勾去掉,并写一个显示装置编号,我的为1。点ok退出。

2.在LINUX中输入vncviewer,出现如图,输入vnc server 的ip+显示装置编号(192.168.0.2:1) 回车出现如图:

如图9

如图10

输入刚才在password后的密码,就会出现windows 2000的界面了!

vnc远程控制源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于远程桌面 vnc、vnc远程控制源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/14006.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载