• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我的玻璃盒子

            [轉]TightVNC 1.3.x src的基本結構及一些概念

                TightVNC(Tight Virtual Network Computing)是一個遠程桌面控制的開源軟件,詳情請參考http://www.tightvnc.com.下載了TightVNC的代碼,分析了一下其Server部分的代碼, WinVNC下的文件很多,但我們按照它們各自的功能做一下劃分,其結構如下:
            KernelvncBuffer.cpp vncClient.cpp vncDesktop.cpp vncServer.cpp WinVNC.cpp
            GUIvncAbout.cpp vncAcceptDialog.cpp vncAdvancedProperties.cpp vncConnDialog.cpp vncMenu.cpp vncProperties.cpp vncTimedMsgBox.cpp
            Miscd3des.c Log.cpp MinMax.cpp RectList.cpp stdhdrs.cpp tableinitcmtemplate.cpp tableinittctemplate.cpp tabletranstemplate.cpp translate.cpp vncauth.c vncInstHandler.cpp vncKeymap.cpp vncRegion.cpp< vncService.cpp
            NetworkVSocket.cpp vncSockConnect.cpp vncHTTPConnect.cpp rfbproto.h
            EncodingvncEncodeCoRRE.cpp vncEncodeHexT.cpp vncEncoder.cpp vncEncodeRRE.cpp vncEncodeTight.cpp vncEncodeZlib.cpp vncEncodeZlibHex.cpp




            其服務端的主要功能模塊結構如下:
            其核心框架就是四個類vncClient,vncServer,vncDesktop和vncBuffer.下面我就這四個類之間的聯系和用途來作一下簡單的分析:
            vncServer:
                vncServer 主要是做如下的一些工作:容許vncClient動態的添加和刪除;將本地vncDesktop對象內部狀態的任何改變"傳播"到各個客戶端;傳播客戶端的鼠標和鍵盤事件到本地的vncDesktop對象。同時,其還創建了vncSockConnect,vncCORBAConnect和 vncHTTPConnect來接受Socket,Corba和HTTP的連接。 vncServer為每個連接上來的客戶端分配了一個ClientID(其實就是內部客戶對象數組的Index),并且提供了對客戶端管理的眾多函數:
            virtual void DisableClients(BOOL state); virtual void KillClient(vncClientId client); virtual void KillAuthClients(); virtual void KillUnauthClients();  virtual vncClient* GetClient(vncClientId clientid); vncClientId AddClient(VSocket *socket, BOOL auth, BOOL shared); virtual void RemoveClient(vncClientId client); 
            同時,vncServer還提供了對客戶Teleport,Capability,KeyboardEnabled,PointerEnabled,Name,Authenticated屬性的get/set方法。
            下面我們來看一下vncServer對客戶端連接上來和客戶端認證成功這兩個事件的處理流程:
            vncServer::AddClient:
                 首先vncServer在其內部的vncClient *m_clientmap[MAX_CLIENTS]數組中為新連接上的客戶端分配一個空閑的slot,并將其作為此客戶的 clientID. 然后,為此連接分配一個vncClient對象,根據傳遞過來的參數,設置vncClient對象的相關屬性,然后調用vncClient::Init方法將vncServer的實例指針和 clientID傳給vncClient實例。接著,m_clientmap[clientid] = client并將此用戶加入vncServer的未認證用戶鏈表。
            vncServer::Authenticated(vncClientId clientid):
                 首先從未認證用戶列表中根據clientid獲取vncClient對象,并將其從unauth list 中刪除。如果是vncServer的第一個用戶,創建vncDesktop對象,并調用m_desktop->Init(this)來初始化該 vncDesktop對象。接下來,為這個用戶分配一個vncBuffer *buffer = new vncBuffer(m_desktop);并通過調用vncClient::SetBuffer為vncClient設置這個Buffer,最后將此用戶添加到auth list中。
                vncServer提供了一個用戶列表的操作接口,這些接口通過將vncServer的方法調用映射到對auth list中各個客戶的同樣的方法的函數調用,這些方法有:
            virtual void TriggerUpdate(); virtual void UpdateRect(RECT &rect); virtual void UpdateRegion(vncRegion ®ion); virtual void CopyRect(RECT &dest, POINT &source); virtual void UpdateMouse(); virtual void UpdateClipText(LPSTR text); virtual void UpdatePalette(); 
            vncDesktop:
                vncDesktop是一個全局唯一的對象,根據注釋,vncDesktop主要是處理從display buffer中獲取數據;同時,它還利用RFBLib DLL為vncServer提供諸如鼠標移動和屏幕更新等信息。上面提到,vncServer在第一個用戶連接上來時發現其m_desktop為空時就創建一個vncDesktip對象,并調用 vncDesktop::Init(this)對其初始化.在vcnDesktop::Init的實現中我們發現其創建了一個 vncDesktopThread,vncDesktop的方法調用大部分都在這個vncDesktopThread里完成的.下面我們來分析一下這個線程都做了些什么:
            vncDesktopThread::run_undetached(void *arg):
                 首先調用vncDesktop::Startup初始化,vncDesktop對象(見vncDesktop::Startup),然后就是處理桌面消息,調用 m_server->UpdateMouse()和m_server->UpdateRegion(rgncache) ,接下來調用vncServer::TriggerUpdate來發送屏幕更新到每個vncClient.然后就是處理RFB_SCREEN_UPDATE和RFB_MOUSE_UPDATE這兩個注冊消息。 

            vncClient:
                vncClient做了數據發送的工作,在vncClient::SendUpdate函數的實現中,我們可以看到vncClient調用SendRFBMsg首先發送 ,然后SendCursorShapeUpdate發送鼠標形狀更新,SendCursorPosUpdate發送鼠標Pos更新,發送SendCopyRect,最后調用SendRectangles發送需要更新的矩形的相關數據。其實每個客戶端vncClient在調用vncClient::Init初始化的時候都開了一個線程,客戶端的行為基本上都是在vncClientThread::run里完成的。該線程在跟客戶端交互完成了認證,Pixel格式,Encoding算法等信息的協商后,就進入一個loop循環開始接受和處理遠程客戶端發過來的rfbSetPixelFormat,rfbSetEncodings, rfbFramebufferUpdateRequest,rfbKeyEvent,rfbPointerEvent,rfbClientCutText 消息。 

            vncBuffer:
                vncBuffer主要處理發送數據的Encoding工作,其提供了遠程客戶的本地視圖,其主要是利用內部的vncDesktop指針來獲取相關的數據。 

            posted on 2011-05-27 17:14 深藍色系統 閱讀(848) 評論(0)  編輯 收藏 引用

            導航

            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            一本色道久久88综合日韩精品| 久久夜色精品国产欧美乱| 国产成人久久久精品二区三区| 国产精品伊人久久伊人电影| 久久天天躁狠狠躁夜夜不卡| 日日躁夜夜躁狠狠久久AV| 亚洲午夜久久影院| 漂亮人妻被中出中文字幕久久 | 久久精品欧美日韩精品| 久久人人爽人人爽人人AV东京热| 久久青草国产精品一区| 久久人妻少妇嫩草AV蜜桃| 夜夜亚洲天天久久| 午夜人妻久久久久久久久| 国内精品久久久久久不卡影院| 日韩人妻无码一区二区三区久久| 99久久精品免费看国产一区二区三区| 日产精品久久久久久久| 久久综合九色欧美综合狠狠| 天天综合久久久网| 久久精品亚洲一区二区三区浴池| 亚洲人成网站999久久久综合| 99久久精品无码一区二区毛片 | 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久综合久久性久99毛片| 国内精品伊人久久久久| 久久久久免费看成人影片| 一本色道久久综合狠狠躁篇| 久久亚洲精品无码播放| 国产真实乱对白精彩久久| 亚洲精品国产成人99久久| 久久久亚洲欧洲日产国码二区 | 日本道色综合久久影院| 99久久精品费精品国产一区二区 | 亚洲精品乱码久久久久久按摩| 亚洲国产天堂久久综合| 少妇久久久久久被弄到高潮| 亚洲精品久久久www| 久久精品国产99国产精品导航| 香蕉久久夜色精品国产2020|