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