• <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>

            我的玻璃盒子

            [轉(zhuǎn)]TightVNC 1.3.x src的基本結(jié)構(gòu)及一些概念

                TightVNC(Tight Virtual Network Computing)是一個(gè)遠(yuǎn)程桌面控制的開(kāi)源軟件,詳情請(qǐng)參考http://www.tightvnc.com.下載了TightVNC的代碼,分析了一下其Server部分的代碼, WinVNC下的文件很多,但我們按照它們各自的功能做一下劃分,其結(jié)構(gòu)如下:
            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




            其服務(wù)端的主要功能模塊結(jié)構(gòu)如下:
            其核心框架就是四個(gè)類(lèi)vncClient,vncServer,vncDesktop和vncBuffer.下面我就這四個(gè)類(lèi)之間的聯(lián)系和用途來(lái)作一下簡(jiǎn)單的分析:
            vncServer:
                vncServer 主要是做如下的一些工作:容許vncClient動(dòng)態(tài)的添加和刪除;將本地vncDesktop對(duì)象內(nèi)部狀態(tài)的任何改變"傳播"到各個(gè)客戶端;傳播客戶端的鼠標(biāo)和鍵盤(pán)事件到本地的vncDesktop對(duì)象。同時(shí),其還創(chuàng)建了vncSockConnect,vncCORBAConnect和 vncHTTPConnect來(lái)接受Socket,Corba和HTTP的連接。 vncServer為每個(gè)連接上來(lái)的客戶端分配了一個(gè)ClientID(其實(shí)就是內(nèi)部客戶對(duì)象數(shù)組的Index),并且提供了對(duì)客戶端管理的眾多函數(shù):
            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); 
            同時(shí),vncServer還提供了對(duì)客戶Teleport,Capability,KeyboardEnabled,PointerEnabled,Name,Authenticated屬性的get/set方法。
            下面我們來(lái)看一下vncServer對(duì)客戶端連接上來(lái)和客戶端認(rèn)證成功這兩個(gè)事件的處理流程:
            vncServer::AddClient:
                 首先vncServer在其內(nèi)部的vncClient *m_clientmap[MAX_CLIENTS]數(shù)組中為新連接上的客戶端分配一個(gè)空閑的slot,并將其作為此客戶的 clientID. 然后,為此連接分配一個(gè)vncClient對(duì)象,根據(jù)傳遞過(guò)來(lái)的參數(shù),設(shè)置vncClient對(duì)象的相關(guān)屬性,然后調(diào)用vncClient::Init方法將vncServer的實(shí)例指針和 clientID傳給vncClient實(shí)例。接著,m_clientmap[clientid] = client并將此用戶加入vncServer的未認(rèn)證用戶鏈表。
            vncServer::Authenticated(vncClientId clientid):
                 首先從未認(rèn)證用戶列表中根據(jù)clientid獲取vncClient對(duì)象,并將其從unauth list 中刪除。如果是vncServer的第一個(gè)用戶,創(chuàng)建vncDesktop對(duì)象,并調(diào)用m_desktop->Init(this)來(lái)初始化該 vncDesktop對(duì)象。接下來(lái),為這個(gè)用戶分配一個(gè)vncBuffer *buffer = new vncBuffer(m_desktop);并通過(guò)調(diào)用vncClient::SetBuffer為vncClient設(shè)置這個(gè)Buffer,最后將此用戶添加到auth list中。
                vncServer提供了一個(gè)用戶列表的操作接口,這些接口通過(guò)將vncServer的方法調(diào)用映射到對(duì)auth list中各個(gè)客戶的同樣的方法的函數(shù)調(diào)用,這些方法有:
            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是一個(gè)全局唯一的對(duì)象,根據(jù)注釋?zhuān)瑅ncDesktop主要是處理從display buffer中獲取數(shù)據(jù);同時(shí),它還利用RFBLib DLL為vncServer提供諸如鼠標(biāo)移動(dòng)和屏幕更新等信息。上面提到,vncServer在第一個(gè)用戶連接上來(lái)時(shí)發(fā)現(xiàn)其m_desktop為空時(shí)就創(chuàng)建一個(gè)vncDesktip對(duì)象,并調(diào)用 vncDesktop::Init(this)對(duì)其初始化.在vcnDesktop::Init的實(shí)現(xiàn)中我們發(fā)現(xiàn)其創(chuàng)建了一個(gè) vncDesktopThread,vncDesktop的方法調(diào)用大部分都在這個(gè)vncDesktopThread里完成的.下面我們來(lái)分析一下這個(gè)線程都做了些什么:
            vncDesktopThread::run_undetached(void *arg):
                 首先調(diào)用vncDesktop::Startup初始化,vncDesktop對(duì)象(見(jiàn)vncDesktop::Startup),然后就是處理桌面消息,調(diào)用 m_server->UpdateMouse()和m_server->UpdateRegion(rgncache) ,接下來(lái)調(diào)用vncServer::TriggerUpdate來(lái)發(fā)送屏幕更新到每個(gè)vncClient.然后就是處理RFB_SCREEN_UPDATE和RFB_MOUSE_UPDATE這兩個(gè)注冊(cè)消息。 

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

            vncBuffer:
                vncBuffer主要處理發(fā)送數(shù)據(jù)的Encoding工作,其提供了遠(yuǎn)程客戶的本地視圖,其主要是利用內(nèi)部的vncDesktop指針來(lái)獲取相關(guān)的數(shù)據(jù)。 

            posted on 2011-05-27 17:14 深藍(lán)色系統(tǒng) 閱讀(846) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統(tǒng)計(jì)

            常用鏈接

            留言簿(75)

            隨筆分類(lèi)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            思思久久好好热精品国产| 久久天天躁狠狠躁夜夜网站| 久久亚洲中文字幕精品有坂深雪 | 97久久精品人妻人人搡人人玩 | www.久久热| 97久久国产亚洲精品超碰热| 久久精品国产第一区二区三区| 亚洲综合精品香蕉久久网| 97精品伊人久久大香线蕉| 97精品伊人久久久大香线蕉| 久久99国产精品久久99小说 | 久久精品国产亚洲av日韩| 一本色道久久99一综合| 久久精品夜夜夜夜夜久久| 国产91色综合久久免费| 国产一区二区精品久久凹凸| 久久久久国色AV免费观看| 伊人精品久久久久7777| AV无码久久久久不卡蜜桃| 国产午夜免费高清久久影院| 精品久久香蕉国产线看观看亚洲| 国产精品成人久久久久久久| 伊人热热久久原色播放www| 中文国产成人精品久久不卡| 国产91色综合久久免费分享| 久久国产精品免费一区二区三区| 欧美成a人片免费看久久| 色诱久久久久综合网ywww| 伊人久久免费视频| 伊人久久综合无码成人网| 91久久香蕉国产熟女线看| 亚洲精品国精品久久99热| 久久99热精品| 亚洲日韩中文无码久久| 国产精品久久久久久久久免费| 一本久久免费视频| 99久久99久久精品国产| 久久亚洲私人国产精品| 一级a性色生活片久久无少妇一级婬片免费放| 日本五月天婷久久网站| 久久久久国产精品嫩草影院|