1. 请问有谁知道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::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; } } Poll机制:客户端通过发送更新请求,请求更新某一个区域。 第一步:读取到一个更新某一个区域的请求 void SMsgReaderV3::readMsg() { case : 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; } }
你看一下吧 我也是给你找的!
2. 请问谁知道哪里有远程控制软件VNC的源码
vnc的源码安装与使用!!!
VNC的原码安装与使用
下载VNC Server与VNC viewer.
VNC Server下载地址:http://www.linuxeden.com/download/softdetail.php?softid=744
VNC viewer下载地址:http://download.pchome.net/php/dl.php?sid=2603
文章分为两部分: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
例如:http://192.168.01.:5801 (如果显示编号为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的界面了!
3. 介绍一下“VNC服务”
VNC:Linux下的远程遥控专家
在微软Windows操作系统中的远程控制工具软件非常多,其中大家最熟悉的莫过于赛门铁克公司的PC ANYWHERE,还有CA ControlIT等等。这些远程控制工具软件都可以通过网络来控制特定的计算机,可以共享那台计算机的数据资料,操作该计算机上的外部设备。
既然在Windows下的远程控制软件如此出色,那么在Linux平台中是否有好用的一次控制工具软件呢?实际上,在Linux操作系统平台中也是存在几款功能强大的远程控制工具软件的,只是这些软件非常少,使用的用户也不是很多,所以一般的Linux用户对它们知道的并不多。
远程控制软件最大的好处就是能通过网络访问特定的计算机。比如您在办公室里上班,想要一些放在家里计算机上的资料,如果使用了远程控制技术,那么您就不必跑回家用软件拷贝文件了,只要通过办公室里的计算机拨号上网或者通过VNP方式就能访问您家里的计算机,输入用户名和密码,就能拷贝到您需要的资料。当然,具体的软件设置方法在Windows下是很容易实现的,使用PC ANYWHERE等软件也可以方便的设置主机和客户端计算机。
在Linux平台中的有些高级用户也知道通过在XFree86 下的X应用软件来远程控制计算机,不过通过这样的方式来远程访问计算机需要宽带技术支持,否则很难实现。还有,这种方式也不能跨平台使用,Linux的主机不能控制非Linux平台的计算机,也就是说Linux的主机只能控制Linux平台的计算机,不能控制Windows和Mac操作系统的计算机。这样给我们的工作会带来很大的不便。
优秀的Linux下的远程遥控专家VNC能帮助我们实现Linux远程控制的愿望。VNC (Virtual Network Computing)是虚拟网络计算机的缩写。VNC是一款优秀的远程控制工具软件,由着名的AT&T的欧洲研究实验室开发的。VNC是在基于UNIX和Linux操作系统的免费的开放源码软件,远程控制能力强大,高效实用,其性能可以和Windows和MAC中的任何远程控制软件媲美。
VNC基本上是由两部分组成:一部分是客户端的应用程序(vncviewer);另外一部分是服务器端的应用程序(vncserver)。VNC的基本运行原理和一些Windows下的远程控制软件很相象。VNC的服务器端应用程序在UNIX和Linux操作系统中适应性很强,图形用户界面十分友好,看上去和Windows下的软件界面也很类似。在任何安装了客户端的应用程序(vncviewer)的Linux平台的计算机都能十分方便的和安装了服务器端的应用程序(vncserver)的计算机相互连接。另外,服务器端 (vncserver)还内建了Java Web接口,这样用户通过服务器端对其他计算机的操作就能通过Netscape显示出来了,这样的操作过程和显示方式比较直观方便。
VNC这款软件可以通过一下网址下载:
http://www.uk.research.att.com/vnc/download.html
VNC最新的版本是3.3.3。该主页上还提供了VNC的二进制程序代码下载3.3.3r1_x86_ Linux_2.0.tgz 有兴趣的朋友可以通过分析其源代码来更深入的了解VNC的工作原理。这个源码压缩包里包括了VNC的客户端和服务器端的Linux版本的完整源码。如果你想要其他操作系统版本(Windows,UNIX)的VNC的话,在该主页上也能找到。
关于其他Windows和MAC版本的VNC软件的安装方法,在这里就不需要讲述了,只要用鼠标双击VNC软件包就能顺利安装,这和其他的Windows下的应用软件是一样的。我们具体的来看一下Linux版本的VNC是如何安装使用的。
首先要把下载到硬盘里的VNC软件包解压。使用untar命令即可。可以把VNC解压到/home/ vnc中,解压后您会发现有vncserver,vncpasswd, vncviewer,Xvnc这4个文件,接着把这4个文件拷贝到/usr/bin 目录中。
如果您想通过VNC的服务器端控制其他的计算机,那么下一步就是创建一个子目录/usr/local/vnc/classes,创建目录后,拷贝这个VNC Java .class文件到/usr/local/vnc/classe目录中,执行以下命令进行配置:
# mkdir -p /usr/
local/vnc/classes
# cp classes/* /usr/
local/vnc/classes
接着,查看你的Linux系统中是否安装了Perl scripting脚本语言。Perl的解释程序在/usr/bin/perl/目录中。如果您的Linux中还没有安装Perl scripting脚本语言,那么您就需要修改vncserver script的第一行指定特定的/usr/bin/perl/目录。一般情况下Linux系统中都会安装有Perl scripting脚本语言的。
好了,主要的VNC配置步骤就是那么多,如果您有特殊的需要,可以参考VNC里的说明进行具体的设置。在完成VNC的安装之后,可以通过在Linux的终端中运行:
# vncserver
来启动VNC的服务器端。VNC的服务器运行之后,首先它会要求您输入服务器密码,您这时候需要为服务器设立一个保护密码,这是非常重要的步骤。如果密码设置成功,那么script中就会显示出这样一个信息:display:1.。这个信息是什么意思呢?原来,在UNIX平台中的VNC服务器端(vncserver)实际上是运行一个自己的特制的终端服务器,用来显示运行的网络中的客户端vncviewer的信息。
因为VNC有自己独立专用的X Server,所以我们可以对它进行相应的设置。这里要告诉读者的是,关于VNC的常见问题解答(FQA),文档等内容在以下网址可以看到,尽管都是英文的资料,不过这几个网址对如何设置VNC的远程控制管理窗口等问题的解答是非常详细的,有需要的了解更多关于VNC的远程管理功能具体设置的朋友可以到以下网址查询:
http://www.uk.research.att.com/vnc/doc.html
http://www.uk.research.att.com/vnc/faq.html
http://www.uk.research.att.com/vnc/start.html
在默认情况下,VNC使用的管理图形用户界面是twm,这个twm管理窗口我想大家一定很熟悉了,在Linux众多的图形管理窗口中,twm对系统的要求是最低的,对资源占用行对其他管理窗口要小很多,这对我们在Linux运行时启动VNC时是非常有用的。twm管理窗口的默认配置参数就存储在/home里地一个隐藏子目录.vnc当中的xstartup文件里,如果您需要对twm重新进行配置,可以在此目录中找到xstartup文件进行修改。
尽管twm管理窗口看上去不如KDE和GNOME那样华丽,但是您在运行VNC进行远程管理的时候并不需要KDE那样复杂的图形用户环境,并且KDE占用的系统资源相对较大,并且不是很容易进行网络管理,有twm就足够了。还有一个比较好的图形用户界面就是fvwm2,这个图形用户界面占用的系统资源也比较小,也适合作为VNC图形管理环境使用。需要fvwm2的读者可以到http://www.fvwm.org下载使用。
对VNC进行测试的工作也非常简单,首先运行VNC的服务器端,然后运行vncviewer xxx.xxx.xxx.xxx:1 ,注意,xxx.xxx.xxx. xxx就是您的计算机的IP地址或者主机名。:1指的是要启动X显示方式。如果您的Linux系统中安装了Java classes,您可以启动NETSCAPE(当然如果您使用的是Windows操作系统,也可以运行Internet Explorer)来连接vncserver,然后输入以下URL:http://xxx. xxx.xxx.xxx:5801 ,同样,xxx.xxx.xxx.xxx是您计算机的IP地址或者主机名。
完成以上步骤后,vncviewer Java applet会自动的载入浏览器,并且提示您输入管理员密码,这样您就可以直观的参看,管理VNC了。
如果您想通过VNC远程控制一台Windows或者MAC平台的计算机,那么请您注意这些计算机的5800端口是否空闲,不被其他设备所占用,因为VNC必须使用5800端口和其他计算机进行连接通讯。
其他操作系统上使用GUI界面的viewers也要特别注意,viewers需要在16位色的显示模式下工作,如果您的Windows操作系统中不能上16位色,那么请您及时的调整您计算机的显示模式。不然viewers无法正常工作。
好了,最后要告诉大家,VNC不但可以通过Linux系统的主机来远程控制其他操作系统的计算机,更令人吃惊的是VNC还可以控制手持式的数码产品。例如使用PalmPilot 和Windows CE平台的PDA(个人数字助理)也能通过无线MODEN和Linux主机相互连接,这样您在上班的的地铁上也能轻松的通过无线PDA和家里的Linux主机相互通讯了。是在是太神奇了。
在不久的将来,VNC还可以通过移动电话来控制其他的计算机,在即将到来的无线时代,VNC的作用将得到人们的重视,让我们为VNC喝采吧。
4. ultravnc 源码怎么样编译
下载源代码:UltraVNC
VS打开源码中的winvnc工程,会导入所有工程,删除如图所示的工程(对一般使用没有影响)
winvnc->右键->属性->配置属性->vc++目录,在包含目录和库目录中添加directX SDK的include和lib目录(解决:fatal error C1083: Cannot open include file: 'd3dx9.h': No