【正文】
則是確保目標(biāo)系統(tǒng)有效且效率高。 課題的結(jié)構(gòu)安排第1章論述了Socket網(wǎng)絡(luò)編程的的研究背景和意義, Socket網(wǎng)絡(luò)編程技術(shù)的國(guó)內(nèi)外研究現(xiàn)狀。 課題的國(guó)內(nèi)外研究現(xiàn)狀基于Socket的網(wǎng)絡(luò)編程技術(shù)在人們不斷的研究和探索下,日益的完善與成熟,已被廣泛的應(yīng)用在通信,醫(yī)療等各個(gè)領(lǐng)域。 關(guān)鍵字:Socket;VC++;網(wǎng)絡(luò)編程;遠(yuǎn)程控制 AbstractWith the rapid development of network technology, puter has brought human civilization aundergone enormous changes, the original physical interface has been unable to meet the requirements of network munication. As the network munication protocol TCP / IP protocol solved the basic problem of this munication, the introduction of a technique called Socket application program interface. Socket network based on programming is a widely utilized nowadays .In this paper, VC development environment, socketbased network programming, implementation and process control system that allows the local puter through the LAN to access different remote puters, and its operation can also be carried out Internet host.This article first briefly introduces the remote desktop monitoring system key technologies, as well as system requirements analysis. The basic framework of the system design and function of each module。TCP/IP(Transmission Control Protocol/Internet Protocol)協(xié)議作為網(wǎng)絡(luò)通信的基本協(xié)議就解決了這一通信難題,它引入了一種稱(chēng)之為“Socket”的應(yīng)用程序接口。本文首先針對(duì)遠(yuǎn)程控制系統(tǒng)的關(guān)鍵技術(shù)進(jìn)行了深入研究,并對(duì)遠(yuǎn)程控制系統(tǒng)的做出了需求分析。如果兩臺(tái)計(jì)算機(jī)是利用一個(gè)“通道”進(jìn)行通信,那么這個(gè)“通道”的兩端就是套接字??蛻?hù)/ 服務(wù)器模式通常采用監(jiān)聽(tīng)/ 連接的方式實(shí)現(xiàn),服務(wù)器端應(yīng)用程序在一個(gè)端口監(jiān)聽(tīng)對(duì)服務(wù)的請(qǐng)求。詳細(xì)設(shè)計(jì)包括了界面設(shè)計(jì),客戶(hù)端模塊設(shè)計(jì)與實(shí)現(xiàn),服務(wù)器模塊設(shè)計(jì)與實(shí)現(xiàn),消息模擬功能的實(shí)現(xiàn),流數(shù)據(jù)的實(shí)現(xiàn),圖形編碼等。第一層:物理層,負(fù)責(zé)最后將信息編碼成電流脈沖或其它信號(hào)以用于網(wǎng)上傳輸。第四層:傳輸層,向高層提供可靠的端到端的網(wǎng)絡(luò)數(shù)據(jù)流服務(wù)。應(yīng)用層的功能一般包括標(biāo)識(shí)通信伙伴、定義資源的可用性和同步通信。實(shí)際上TCP/IP標(biāo)準(zhǔn)并不定義與ISO數(shù)據(jù)鏈路層和物理層相對(duì)應(yīng)的功能。因特網(wǎng)的應(yīng)用層協(xié)議包括Finger、Whois、FTP(文件傳輸協(xié)議)、Gopher、HTTP(超文本傳輸協(xié)議)、Telent(遠(yuǎn)程終端協(xié)議)、SMTP(簡(jiǎn)單郵件傳送協(xié)議)、IRC(因特網(wǎng)中繼會(huì)話)、NNTP(網(wǎng)絡(luò)新聞傳輸協(xié)議)等。這對(duì)數(shù)據(jù)的穩(wěn)定性、正確性和發(fā)送/接收順序要求嚴(yán)格的應(yīng)用十分適用,TCP協(xié)議使用該類(lèi)接口。套接字編程基本概念進(jìn)程通信的概念最初來(lái)源于單機(jī)系統(tǒng)。因此,網(wǎng)間進(jìn)程通信還要解決多重協(xié)議的識(shí)別問(wèn)題。在TCP/IP協(xié)議的實(shí)現(xiàn)中,端口的操作類(lèi)似于一般的I/O操作,進(jìn)程獲取一個(gè)端口,相當(dāng)于獲取本地唯一的I/O文件,可以用一般的讀寫(xiě)原語(yǔ)訪問(wèn)。因此,每一個(gè)標(biāo)準(zhǔn)服務(wù)器都擁有一個(gè)全局公認(rèn)的端口(即周知口,wellknown port),即使在不同的機(jī)器上,其端口號(hào)也相同。為保證數(shù)據(jù)的正確性,在網(wǎng)絡(luò)協(xié)議中須指定網(wǎng)絡(luò)字節(jié)順序。(7)順序在網(wǎng)絡(luò)傳輸中,兩個(gè)連續(xù)報(bào)文在端-端通信中可能經(jīng)過(guò)不同路徑,這樣到達(dá)目的地時(shí)的順序可能會(huì)與發(fā)送時(shí)不同。服務(wù)的表現(xiàn)形式是原語(yǔ)(primitive),如系統(tǒng)調(diào)用或庫(kù)函數(shù)。 無(wú)連接服務(wù)是郵政系統(tǒng)服務(wù)的抽象,每個(gè)分組都攜帶完整的目的地址,各分組在系統(tǒng)中獨(dú)立傳送。Winsock規(guī)范定義并記錄了任何使用API與Internet通訊協(xié)議(ISP通常指TCP/IP)連接。根據(jù)通信性質(zhì)不同可分為:Stream Sockets(流式套接字)和Datagram Sockets(數(shù)據(jù)報(bào)套接字),其中Stream Sockets提供無(wú)差錯(cuò)的、面向連接的、無(wú)長(zhǎng)度限制的雙向字節(jié)流傳輸,適應(yīng)于處理大量數(shù)據(jù),尤其適合于FTP服務(wù)。面向連接的協(xié)議在連接端點(diǎn)之間建立一條虛電路,面向連接的客戶(hù)程序不必關(guān)心網(wǎng)絡(luò)軟件使用怎樣的本地地址傳輸數(shù)據(jù)。無(wú)連接協(xié)議不建立與遠(yuǎn)地服務(wù)器的直接連接。應(yīng)用程序在完成對(duì)請(qǐng)求的Socket庫(kù)的使用后,要調(diào)用WSACleanup函數(shù)來(lái)解除與Socket庫(kù)的綁定并且釋放Socket庫(kù)所占用的系統(tǒng)資源。假如該函數(shù)執(zhí)行成功,則返回0;如果執(zhí)行失敗,則返回SOCKET_ERROR。Windows系統(tǒng)內(nèi)部各圖像繪制操作都是以BMP為基礎(chǔ)的。位圖信息頭和顏色表組成位圖信息,B1TMAPINFO結(jié)構(gòu)定義如下:typcdefstruct tagBITMAPINFO{BITMAPINFoHEADER bmiIIeader; ∥位圖信息頭RGBQUAD bmiColors; ∥顏色表}BITMAPINFO;(4)位圖數(shù)據(jù)位圖數(shù)據(jù)記錄了位圖的每一個(gè)像素值,記錄順序是掃描行內(nèi)從左到右,掃描行之問(wèn)從下到上。利用前一個(gè)事實(shí)的壓縮技術(shù)就是無(wú)損壓縮技術(shù),即壓縮后的圖像數(shù)據(jù)還原后與未壓縮時(shí)嚴(yán)格相同,沒(méi)有失真,如TIFF圖像文件格式;利用后一個(gè)事實(shí)的壓縮技術(shù)就是有損壓縮技術(shù),即壓縮后的圖像數(shù)據(jù)與未壓縮時(shí)有所不同,但不影晌人們對(duì)原始資料表達(dá)的信息造成誤解,如JPEG圖像文件格式。假如用n1和n2分別代表用來(lái)表達(dá)相同信息的2個(gè)數(shù)據(jù)集合中的信息載體單位的個(gè)數(shù),那么壓縮率CR為:Cr=nl/n2,一般情況下Cr在開(kāi)區(qū)間(0,+∞)中取值。它使用預(yù)先二進(jìn)制描述來(lái)替換每個(gè)符號(hào),長(zhǎng)度由特殊符號(hào)出現(xiàn)的頻率決定。該壓縮方法編碼也是以?xún)蓚€(gè)字節(jié)為基本單位。這種方法還是非常有效的。該程序采用TCP協(xié)議,因?yàn)榱骺睾筒羁氐拇嬖谑沟脗鬏敻哂蟹€(wěn)定性。 系統(tǒng)的基本框架,在支持TCP/IP協(xié)議的網(wǎng)絡(luò)中,本地計(jì)算機(jī)與遠(yuǎn)程主機(jī)通過(guò)物理網(wǎng)絡(luò)相連。4 系統(tǒng)的詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 界面設(shè)計(jì) 客戶(hù)端界面界面是系統(tǒng)功能得以實(shí)現(xiàn)的基本平臺(tái),這里充分利用VC++。 服務(wù)器主界面服務(wù)器選項(xiàng)界面,包括開(kāi)啟服務(wù)器,終止服務(wù),退出選項(xiàng)。 WSAPROTOCOL_INFO Protocol。dwLen)。 if (sClient == INVALID_SOCKET) return 1。server,sizeof(server)) == SOCKET_ERROR) { memset(szString,39。根據(jù)這個(gè)思想,需要兩個(gè)獨(dú)立的程序,SERVER REMOTE CONTROL和CLIENT REMOTE CONTROL。 int nRet。 struct myStruct myStructure。Protocol)。 if (bind(Listen,(struct sockaddr *)amp。這樣的技術(shù)被稱(chēng)為消息模擬。應(yīng)用程序可以調(diào)用GetMessageExtraInfo獲得這些額外信息。 圖形編碼該程序數(shù)據(jù)圖型編碼采用的是C庫(kù)中的哈夫曼壓縮編碼技術(shù),下面稍作解釋以下:哈夫曼編碼的原理是:一個(gè)符號(hào)發(fā)生頻率越高,其碼長(zhǎng)越短,反之則越長(zhǎng)。當(dāng)利用哈夫曼編碼對(duì)一篇英文進(jìn)行壓縮時(shí),e極有可能用一個(gè)位(bit)來(lái)表示,而z則可能花去 25個(gè)位(不是26)。Windows程序的所有輸出都是圖形。Windows下的輸出是設(shè)備無(wú)關(guān)的。GDI提供兩種基本服務(wù):創(chuàng)建圖形輸出和存儲(chǔ)圖象。GDI的圖形輸出是面向窗口的,面向窗口包含兩層含義:(1)每個(gè)窗口作為一個(gè)獨(dú)立的繪圖接口來(lái)處理,有它自己的繪圖坐標(biāo)。選擇另一臺(tái)主機(jī)安裝客戶(hù)端程序,作為客戶(hù)機(jī)。 服務(wù)器待接收文件點(diǎn)擊遠(yuǎn)程控制,選擇網(wǎng)格空間數(shù)目選項(xiàng)。 開(kāi)啟攝像頭打開(kāi)桌面迅雷視頻播放器。本文設(shè)計(jì)并實(shí)現(xiàn)了分塊截取屏幕的算法,應(yīng)用這一算法可以減少需要傳送的數(shù)據(jù)量,大大的降低了網(wǎng)絡(luò)的負(fù)載,同時(shí)又能及時(shí)準(zhǔn)確地真實(shí)再現(xiàn)被控端當(dāng)前的屏幕信息。感謝我大學(xué)里的所有老師,是你們提高了我的素質(zhì)修養(yǎng),豐富了我的人生閱歷,教會(huì)了我書(shū)本上學(xué)不到的知識(shí),沒(méi)有你們無(wú)私的付出,我永遠(yuǎn)會(huì)在無(wú)知的迷茫中徘徊躊躇。本系統(tǒng)目前使用效果良好。 視頻播放 測(cè)試結(jié)果服務(wù)器開(kāi)啟后,客戶(hù)端可實(shí)現(xiàn)連接,連接成功后,客戶(hù)端顯示服務(wù)器端的桌面情況,客戶(hù)端可隨時(shí)改變數(shù)據(jù)壓縮方式,并可選擇不壓縮,客戶(hù)端還可以選擇色彩模式,256色的明顯比16色模式要清晰,分辨率提高。 顯示網(wǎng)格將水平網(wǎng)格數(shù),垂直網(wǎng)格數(shù),分別改為原來(lái)的二倍。 系統(tǒng)功能和性能測(cè)試 客戶(hù)端顯示測(cè)試在主機(jī)A運(yùn)行服務(wù)器程序。每個(gè)窗口必須獨(dú)立的維護(hù)自己的輸出。這些繪圖函數(shù)分為三類(lèi):一是文字輸出,二是矢量圖形函數(shù),用于畫(huà)線、圓等幾何圖形,三是光柵(位圖)圖形函數(shù),用于繪制位圖。這樣的程序編寫(xiě)起來(lái)繁瑣,而且不容易移植(因?yàn)閾Q一臺(tái)不同型號(hào)的打印機(jī)就要重新修改程序)。二者相比,e使用了一般編碼的1/8的長(zhǎng)度,z則使用了 3倍多。 打個(gè)不恰當(dāng)?shù)谋确?,現(xiàn)在用的最多的幾個(gè)漢字“個(gè)”“的”“們”“什”“么”什么的筆畫(huà)不是都很少嗎?這就是文字演變的規(guī)律,也就是哈夫曼編碼的原理。然后將當(dāng)前改變區(qū)域的屏幕的內(nèi)容發(fā)送到客服端。相關(guān)的功能函數(shù)介紹如下:1 、Keybd_event函數(shù)VOID key_event(BYTE bvk,BYTE bScan,DWORD dwFlags,ULONG_PTR dwExtraInfo)bVk:定義了一個(gè)虛擬鍵碼,它的范圍是1~254bScan:保留dwFlags:定義函數(shù)操作類(lèi)型,按下或彈起DwExtraInfo:定義了擊鍵的額外關(guān)聯(lián)值程序中想要模擬PRINTSCRN的消息,去抓取屏幕的內(nèi)容并將其保存到剪切板中,那么可以將參數(shù)BVK設(shè)置為VK_SNAPSHOT。 MessageBox(NULL,szString,Remote Server,MB_OK)。 if (Listen == SOCKET_ERROR) { sprintf(szString,socket() failed: %d,WSAGetLastError())。 nRet = WSAEnumProtocols(NULL,NULL,amp。 int iAddrSize。網(wǎng)絡(luò)模塊:負(fù)責(zé)監(jiān)聽(tīng)客服端的連接,負(fù)責(zé)接收并處理客服端發(fā)過(guò)來(lái)的消息命令,在本機(jī)上處理這些消息并發(fā)送各種數(shù)據(jù),如屏幕數(shù)據(jù),命令反饋數(shù)據(jù)等,到客服端監(jiān)聽(tīng)程序。,sizeof(szString))。 setsockopt(sClient,SOL_SOCKET,SO_RCVBUF,(char *)amp。 } pBuf = malloc(dwLen)。 char szMessage[81]。 開(kāi)啟服務(wù)器選項(xiàng) 客戶(hù)端模塊設(shè)計(jì)與實(shí)現(xiàn)客戶(hù)端實(shí)現(xiàn)原理網(wǎng)絡(luò)模塊:負(fù)責(zé)連接到服務(wù)器的監(jiān)聽(tīng)Socket;負(fù)責(zé)向服務(wù)器發(fā)送各種操作命令,如鼠標(biāo),鍵盤(pán),各種參數(shù)消息等命令。 客戶(hù)端主界面客戶(hù)端菜單欄,遠(yuǎn)程控制選項(xiàng)界面包括服務(wù)器連接,斷開(kāi)服務(wù)器,數(shù)據(jù)壓縮,網(wǎng)格空間數(shù)目,色彩模式選擇,退出選項(xiàng)。兩端的程序通過(guò)套接字Socket建立連接。通過(guò)Socket傳遞的虛擬消息結(jié)構(gòu)體到對(duì)端,被對(duì)端主機(jī)解釋并虛擬,最終達(dá)到程序目的。這是當(dāng)遠(yuǎn)程訪問(wèn)軟件出場(chǎng)的時(shí)候了,它能幫助你訪問(wèn)遠(yuǎn)程計(jì)算機(jī)就像訪問(wèn)自己的計(jì)算機(jī)一樣,距離不再是問(wèn)題。如編碼 0504表示從當(dāng)前位置開(kāi)始連續(xù)顯示5個(gè)顏色值為04的像素。哈夫曼算法在改變?nèi)魏畏?hào)二進(jìn)制編碼引起少量密集表現(xiàn)方面是最佳的,然而,它并不處理符號(hào)的順序和重復(fù)或序號(hào)的序列。如果能減少或消除其中的一種或多種冗余,就能取得數(shù)據(jù)壓縮的效果。采取有損壓縮的方法進(jìn)行數(shù)據(jù)壓縮,在解壓時(shí)會(huì)造成較大的誤差擴(kuò)。Windows規(guī)定下個(gè)掃描行所占的字節(jié)數(shù)必須是4的倍數(shù)(即以long為單位),不足的以0填充。Windows ,因此把這種BMP圖像文件格式稱(chēng)為設(shè)備無(wú)關(guān)位圖(DIB)格式。該函數(shù)的第一個(gè)參數(shù)指定處于監(jiān)聽(tīng)狀態(tài)的流套接字;操作系統(tǒng)利用第二個(gè)參數(shù)來(lái)返回新創(chuàng)建的套接字的地址結(jié)構(gòu);操作系統(tǒng)利用第三個(gè)參數(shù)來(lái)返回新創(chuàng)建的套接字的地址結(jié)構(gòu)的長(zhǎng)度。由于每個(gè)進(jìn)程中都有一個(gè)套接字描述符表,表中的每個(gè)套接字描述符都對(duì)應(yīng)了一個(gè)位于操作系統(tǒng)緩沖區(qū)中的套接字?jǐn)?shù)據(jù)結(jié)構(gòu),因此有可能有幾個(gè)套接字描述符指向同一個(gè)套接字?jǐn)?shù)據(jù)結(jié)構(gòu)。Winsock用bind函數(shù)給Socket指定一個(gè)本地IP地址和一個(gè)協(xié)議端口,其典型調(diào)用如下:result=bind(“Socket句柄”,“本地Socket地址”,“本地Socket地址長(zhǎng)度”);服務(wù)器程序使用bind函數(shù)用Winsock登記一個(gè)協(xié)議端口,程序告訴Winsock監(jiān)視哪一個(gè)協(xié)議端口的數(shù)據(jù)傳送,Winsock接著告訴傳輸層將此協(xié)議端口收