機(jī)房監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  機(jī)房監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  摘 要</b></p><p>  為提高機(jī)房使用效率,凈化上機(jī)環(huán)境,杜絕個(gè)別用戶使用機(jī)房?jī)?nèi)電腦做違規(guī)的事情,為機(jī)房管理員提供一個(gè)好的機(jī)房監(jiān)控系統(tǒng)是必要的。作者在對(duì)機(jī)房微機(jī)管理過(guò)程進(jìn)行了詳細(xì)調(diào)查后,參考了一些網(wǎng)吧的微機(jī)管理系統(tǒng),獲得了機(jī)房監(jiān)控系統(tǒng)的設(shè)計(jì)思路。機(jī)房管理系統(tǒng)應(yīng)當(dāng)能使管理員極其方便

2、的獲取某臺(tái)微機(jī)的屏幕視圖,鎖定某臺(tái)電腦的鍵盤(pán)和鼠標(biāo)輸入,并能發(fā)送消息給指定的電腦用戶。</p><p>  本論文從理論上分析了實(shí)現(xiàn)機(jī)房監(jiān)控系統(tǒng)所需要的基礎(chǔ)技術(shù)的原理,并以VC++6.0作為開(kāi)發(fā)工具,在Win32平臺(tái)下實(shí)現(xiàn)了一個(gè)機(jī)房監(jiān)控系統(tǒng)。論文第二部分簡(jiǎn)述了TCP/IP協(xié)議以及Socket編程技術(shù),第三部分講述了系統(tǒng)的設(shè)計(jì)目標(biāo)和通信協(xié)議,第四章則介紹了實(shí)現(xiàn)過(guò)程中使用的核心技術(shù),包括屏幕截圖、鎖定屏幕以及服務(wù)器端

3、和客戶端的通信。通過(guò)本文的研究,為機(jī)房監(jiān)控系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)展示了一個(gè)完整的方案,具有一定參考價(jià)值。</p><p>  關(guān)鍵詞:機(jī)房監(jiān)控系統(tǒng);屏幕截圖;鎖定屏幕;Socket</p><p>  The Design and Implementation of the Computer Room Monitor and Control System</p><p>

4、<b>  Abstract</b></p><p>  It is necessary to provide a computer room monitor and control system with good quality so that the users will obey the room rules and the room can work effectively in

5、a steady environment. After analyzing the process of the computer room management and studying some Cyber-Cafe management system, the concept framework of the computer room monitor and control system was gained. At least

6、, the monitor system must provide abilities to snap the screen of the computer specified by the manager, to disa</p><p>  This article enumerated the technologies needed for the implementation of the monitor

7、 system and introduced in detail about the issue that how to build a Win32 executable system by using the VC++6.0 as the development tools. In this article, the 2nd chapter introduced the TCP/IP protocol and the Socket p

8、rogramming; the 3rd chapter described the design goals and the communication protocol; the 4th chapter covered the technology cores of the monitor and control system, which were screen snapping, </p><p>  Ke

9、y words: computer room monitor system; snap screen; lock screen; socket</p><p><b>  目 錄</b></p><p><b>  論文總頁(yè)數(shù):31頁(yè)</b></p><p><b>  1.引言1</b><

10、/p><p><b>  1.1課題背景1</b></p><p><b>  1.2內(nèi)容介紹1</b></p><p>  2.相關(guān)技術(shù)原理介紹2</p><p>  2.1 TCP/IP協(xié)議2</p><p>  2.1.1 TCP/IP協(xié)議簡(jiǎn)介2</p>

11、;<p>  2.1.2 TCP協(xié)議2</p><p>  2.1.3 IP協(xié)議3</p><p>  2.1.4 TCP/IP模型3</p><p>  2.2 Socket技術(shù)6</p><p>  2.2.1 Socket基本概念6</p><p>  2.2.2 Socket類型及規(guī)范

12、7</p><p>  2.2.3 Win Socket API8</p><p>  2.3 Win32編程技術(shù)13</p><p>  3.系統(tǒng)的設(shè)計(jì)14</p><p>  3.1系統(tǒng)設(shè)計(jì)目標(biāo)14</p><p>  3.2系統(tǒng)架構(gòu)設(shè)計(jì)15</p><p>  4.系統(tǒng)的實(shí)現(xiàn)1

13、9</p><p>  4.1用戶界面的實(shí)現(xiàn)19</p><p>  4.2核心算法的實(shí)現(xiàn)20</p><p>  4.2.1客戶端和服務(wù)器端的通信20</p><p>  4.2.2 屏幕截圖23</p><p>  4.2.3 鎖屏和解屏26</p><p><b>  

14、結(jié) 論28</b></p><p><b>  參考文獻(xiàn)28</b></p><p><b>  致 謝30</b></p><p><b>  聲 明31</b></p><p><b>  1引言</b></

15、p><p><b>  1.1課題背景</b></p><p>  當(dāng)今時(shí)代是一個(gè)信息種類多元化,信息量巨大化,傳播速度急速化的時(shí)代。要積極面臨這種現(xiàn)狀,就要能快速的處理各種信息,從而引申出人們對(duì)信息處理工具的高度關(guān)注。而各種電子設(shè)備,尤其是電腦等硬件設(shè)備的出現(xiàn),給人們的日常生活帶來(lái)極大的變化。隨著計(jì)算機(jī)網(wǎng)絡(luò)的出現(xiàn),更使得人們的信息處理方式發(fā)生了革命性的改變。毫無(wú)疑問(wèn),計(jì)

16、算機(jī)以及由計(jì)算機(jī)組成的計(jì)算機(jī)網(wǎng)絡(luò)已經(jīng)成為當(dāng)今時(shí)代最佳的信息處理工具。掌握這個(gè)工具對(duì)于科研和學(xué)習(xí)有著重要意義。</p><p>  鑒于這種情況,現(xiàn)在許多學(xué)校都提供了微機(jī)室,讓在校學(xué)生可以很好的學(xué)習(xí)計(jì)算機(jī)操作,并使用計(jì)算機(jī)輔助學(xué)習(xí)。對(duì)于同學(xué)們來(lái)說(shuō),這本來(lái)是個(gè)很好的機(jī)會(huì),但有個(gè)別同學(xué)未能珍惜這個(gè)機(jī)會(huì),他們沒(méi)有好好利用這些微機(jī)進(jìn)行學(xué)習(xí)和研究,而是在機(jī)房?jī)?nèi)打游戲或者閑聊等,甚至有人利用電腦進(jìn)行違反法規(guī)的活動(dòng)。這些同學(xué)不但

17、浪費(fèi)了自身的學(xué)習(xí)機(jī)會(huì),同時(shí)也浪費(fèi)了學(xué)校的寶貴資源,而且給周圍的同學(xué)造成了很不好的影響。因此,如何對(duì)機(jī)房進(jìn)行有效的管理成為了一個(gè)不容忽視的問(wèn)題。</p><p>  對(duì)于機(jī)房管理,一方面應(yīng)該設(shè)立專門的管理員,擬定詳細(xì)的機(jī)房使用規(guī)則;另一方面,也應(yīng)該配備強(qiáng)大的管理軟件,輔助管理員進(jìn)行管理。因此,如何設(shè)計(jì)和實(shí)現(xiàn)機(jī)房監(jiān)控系統(tǒng)成為了本次課題的研究問(wèn)題。</p><p><b>  1.2內(nèi)

18、容介紹</b></p><p>  文章在第二章介紹了一些基本的技術(shù)原理,涉及到TCP/IP協(xié)議、Socket技術(shù)、Win32編程等概念,這些都是實(shí)現(xiàn)機(jī)房監(jiān)控系統(tǒng)的基礎(chǔ)技術(shù)。在第三章,首先討論了機(jī)房監(jiān)控系統(tǒng)應(yīng)該具備哪些功能,接著設(shè)計(jì)出了服務(wù)器端和客戶端器的通信協(xié)議。在第四章,首先講述了用戶界面的實(shí)現(xiàn),接著著重介紹了幾個(gè)核心技術(shù)的實(shí)現(xiàn),包括如何對(duì)某個(gè)特定客戶端進(jìn)行屏幕截圖,如何鎖定指定客戶端的屏幕以及如

19、何在服務(wù)器端和客戶端的進(jìn)行通信。</p><p><b>  2相關(guān)技術(shù)原理介紹</b></p><p>  2.1 TCP/IP協(xié)議</p><p>  2.1.1 TCP/IP協(xié)議簡(jiǎn)介</p><p>  所謂協(xié)議是一套用技術(shù)術(shù)語(yǔ)描述某些事物應(yīng)該如何做的規(guī)則。如果執(zhí)行不同的協(xié)議(一方知道某事的概念,但另一方卻不知道)

20、,那么他們會(huì)因各自的協(xié)議無(wú)法溝通而完不成有用的工作。在計(jì)算機(jī)網(wǎng)絡(luò)領(lǐng)域中,為了完成一項(xiàng)任務(wù),所涉及的兩個(gè)(或多個(gè))通信實(shí)體必須運(yùn)行同樣的協(xié)議。</p><p>  Internet是 由眾多的計(jì)算機(jī)網(wǎng)絡(luò)交錯(cuò)連接形成的網(wǎng)際網(wǎng),作為Internet成員的各種網(wǎng)絡(luò)在通訊中分別執(zhí)行自己的協(xié)議。所謂Internet協(xié)議是指在Internet的網(wǎng)絡(luò)之間以及各成員網(wǎng)內(nèi)部交換信息時(shí)要求遵循的協(xié)議。在Internet中,到處運(yùn)行著協(xié)

21、議,凡是涉及兩個(gè)或多個(gè)遠(yuǎn)程實(shí)體的通信活動(dòng)均由協(xié)議來(lái)支配。協(xié)議定義了兩個(gè)或多個(gè)通信實(shí)體間所交換消息的格式與順序,以及在發(fā)出和/或收到一個(gè)消息或者發(fā)生其他事件所采取的行動(dòng)。TCP/IP是Internet網(wǎng)絡(luò)上使用的通用協(xié)議。Internet依靠上千個(gè)網(wǎng)絡(luò)和百萬(wàn)計(jì)的計(jì)算機(jī),而 TCP/IP是把它們合在一起的粘結(jié)劑。</p><p>  TCP/IP的目標(biāo)是提供高速網(wǎng)絡(luò)通信鏈路。TCP/IP的實(shí)際名字來(lái)源于兩個(gè)最重要的協(xié)

22、議:TCP協(xié)議與IP協(xié)議,其中傳輸控制協(xié)議TCP對(duì)應(yīng)于開(kāi)放系統(tǒng)互聯(lián)0SI參考模型的傳輸層協(xié)議;網(wǎng)絡(luò)連接協(xié)議IP則對(duì)應(yīng)于OSI參考模型的網(wǎng)絡(luò)層協(xié)議。所以TCP/IP分別是Internet在傳輸層和網(wǎng)絡(luò)層執(zhí)行的協(xié)議。</p><p>  2.1.2 TCP協(xié)議</p><p>  TCP協(xié)議是互聯(lián)網(wǎng)傳輸層協(xié)議。TCP服務(wù)模型包括面向連接的服務(wù)和可靠的數(shù)據(jù)傳輸服務(wù),調(diào)用TCP作為其傳輸協(xié)議的應(yīng)用

23、同時(shí)取得這兩種服務(wù)??傮w來(lái)說(shuō),TCP保證遞送全部數(shù)據(jù),但對(duì)遞送速率和所經(jīng)歷的延遲不加保證。電子郵件、遠(yuǎn)程終端訪問(wèn)、Web和文件傳送都使用TCP。這些應(yīng)用選擇TCP的主要原因在于TCP提供可靠的數(shù)據(jù)傳輸服務(wù),能夠保證所有數(shù)據(jù)最終到達(dá)其目的地。</p><p>  TCP的傳輸實(shí)體一般為軟件實(shí)現(xiàn):一部分是用戶進(jìn)程,一部分是操作系統(tǒng)的部分核心(管理TCP字節(jié)流,實(shí)現(xiàn)與IP層的接口)。TCP的傳輸服務(wù)是通過(guò)在收發(fā)雙方創(chuàng)建

24、套接字Socket來(lái)實(shí)現(xiàn)的;Socket的地址是通過(guò)IP地址與端口號(hào)來(lái)標(biāo)識(shí)的。每條TCP的傳輸連接用發(fā)送端套接字、接收端套接字來(lái)表示,是點(diǎn)到點(diǎn)的全雙工通道(全雙工——支持同時(shí)的雙向傳輸)運(yùn)行與TCP上的應(yīng)用程序包括FTP、HTTP、SMTP和TELNET。</p><p>  在Internet內(nèi)部,從主機(jī)傳送到主機(jī)的信息不是一個(gè)恒定的流,而是把數(shù)據(jù)分解成小包,即數(shù)據(jù)包。例如你要發(fā)一分很長(zhǎng)的電子郵件(E-mail

25、)給一位朋友,TCP就將該信息分成很多個(gè)數(shù)據(jù)包,每一個(gè)數(shù)據(jù)包用一序號(hào)和接收地址來(lái)標(biāo)記。此外TCP還插入一些糾錯(cuò)信息。接著數(shù)據(jù)包被傳過(guò)網(wǎng)絡(luò),即把它們傳送給遠(yuǎn)程的主機(jī)這就是IP的工作。在另一端TCP接收數(shù)據(jù)并檢查錯(cuò)誤。如果有錯(cuò)誤發(fā)生,TCP就可以要求重發(fā)信息。換句話說(shuō),IP的工作是把原始數(shù)據(jù)(數(shù)據(jù)包)從一端傳送到另一端;TCP的工作就是管理這種流動(dòng)并確保其數(shù)據(jù)是正確的。把數(shù)據(jù)分解成數(shù)據(jù)包有很多的好處。首先,它允許Internet讓很多不同的

26、用戶在同一時(shí)間用同一通訊線路。因?yàn)檫@些數(shù)據(jù)包不必一起輸送,所以通訊線路可以載著所有類型的數(shù)據(jù)包按它們自己的路徑從一地到另一地。就如同一條高速公路上,各類汽車(即使它們開(kāi)向不同的地方)都在公共道路上行駛。當(dāng)數(shù)據(jù)包傳輸時(shí),它們沿規(guī)定的路由從主機(jī)到主機(jī),一直到它們到達(dá)最終目的地。這意味著Internet很具靈活性。如果一個(gè)特定的連接中斷了,控制數(shù)據(jù)流動(dòng)的計(jì)算機(jī)通常可以找到另一條路由。事實(shí)上,在單一數(shù)據(jù)傳輸中,多個(gè)數(shù)據(jù)包完全可</p>

27、;<p>  2.1.3 IP協(xié)議</p><p>  網(wǎng)際網(wǎng)絡(luò)協(xié)議(IP)用于數(shù)據(jù)報(bào)交換網(wǎng)絡(luò)互連系統(tǒng)種,是TCP/IP協(xié)議堆棧所采用的傳輸協(xié)議。IP協(xié)議的基本數(shù)據(jù)形態(tài)是數(shù)據(jù)元(datagram),一般都成為數(shù)據(jù)報(bào),此協(xié)議提供了從來(lái)源主機(jī)到目的主機(jī)之間數(shù)據(jù)報(bào)的傳輸機(jī)制。IP數(shù)據(jù)報(bào)中攜帶這來(lái)源地址和目的地址,利用這些地址數(shù)據(jù),可將數(shù)據(jù)報(bào)傳輸?shù)侥康闹鳈C(jī)。IP協(xié)議具有數(shù)據(jù)報(bào)分割以及重組機(jī)制,需要的時(shí)候可以

28、將數(shù)據(jù)報(bào)作適當(dāng)?shù)姆指钜约爸亟M,以便能夠在網(wǎng)絡(luò)中傳輸。</p><p>  IP協(xié)議是網(wǎng)絡(luò)層協(xié)議,它是一種不可靠的,無(wú)連接導(dǎo)向的協(xié)議,無(wú)論是端對(duì)端或者路由器對(duì)路由器,都不提供可靠的傳輸,也不會(huì)提供確認(rèn)信息,除了報(bào)頭校驗(yàn)和外,IP協(xié)議本身沒(méi)有數(shù)據(jù)的錯(cuò)誤控制機(jī)制,一旦數(shù)據(jù)發(fā)生錯(cuò)誤或者未能完整的接收,都不能重傳。甚至即使是只有一個(gè)字節(jié)發(fā)生錯(cuò)誤或者沒(méi)有收到,也必須將整個(gè)數(shù)據(jù)報(bào)都丟棄。雖然,IP協(xié)議提供了數(shù)據(jù)報(bào)的傳輸機(jī)制,但

29、是并沒(méi)有提供傳輸?shù)目煽啃?、流量控制、順序性服?wù)機(jī)制,它所提供的只是最佳化的傳輸服務(wù)。</p><p>  2.1.4 TCP/IP模型</p><p>  習(xí)慣上,人們把Internet的通訊協(xié)議籠統(tǒng)地稱為TCP/IP協(xié)議,也有人把Internet稱為TCP/IP網(wǎng)或TCP/IP Internet網(wǎng)。在這種意義下,Internet的TCP/IP協(xié)議可以說(shuō)就是基于四種模型的協(xié)議:即應(yīng)用層、傳

30、輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)訪問(wèn)層。其中網(wǎng)絡(luò)訪問(wèn)層又分為網(wǎng)絡(luò)接口層(鏈路層)和最基礎(chǔ)的物理層。所以也可以說(shuō)Internet的網(wǎng)絡(luò)協(xié)議是基于五層模型的協(xié)議。</p><p>  根據(jù)TCP/IP協(xié)議,互聯(lián)網(wǎng)分為4層,加上最底層的硬件層一共是5層</p><p>  圖2-1 TCP/IP協(xié)議分層</p><p><b>  1)物理層:</b></p

31、><p>  物理層的任務(wù)是把幀中的各位從一個(gè)節(jié)點(diǎn)移往下一個(gè)節(jié)點(diǎn)。這一層的協(xié)議也取決于鏈路,而進(jìn)一步取決于鏈路真正的傳輸介質(zhì)。</p><p>  物理層提供了一個(gè)基本機(jī)制:對(duì)二進(jìn)制數(shù)據(jù)(比特)進(jìn)行編碼(發(fā)送到物理介質(zhì))和解碼(從物理介質(zhì)接收),例如10Mbit/s(bit/s指比特每秒)以太網(wǎng)的曼徹斯特編碼、光纖分布式數(shù)據(jù)接口(Fiber Distributed data Interface

32、,簡(jiǎn)稱FDDI)的4B/5B編碼;物理層也負(fù)責(zé)通知第二層(鏈路層)何時(shí)訪問(wèn)介質(zhì)。物理層以比特流的方式傳送來(lái)自鏈路層的數(shù)據(jù),而不理會(huì)數(shù)據(jù)的含義或格式;同樣,它接收數(shù)據(jù)以后,不加分析直接傳給鏈路層。</p><p>  物理層也定義與介質(zhì)的物理連接機(jī)制,但不是介質(zhì)本身,按照參考模型的原理,實(shí)際的物理介質(zhì)在物理層之下。</p><p><b>  2)鏈路層:</b><

33、;/p><p>  鏈路層的任務(wù)是把完整的幀從一個(gè)網(wǎng)絡(luò)組建移往某個(gè)緊鄰的組件,負(fù)責(zé)管理數(shù)據(jù)格式。它定義了將數(shù)據(jù)組成正確幀的規(guī)程和在網(wǎng)絡(luò)中傳輸幀的規(guī)程,幀是指一串?dāng)?shù)據(jù),它是數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)膯挝?。網(wǎng)絡(luò)層在源端和目的端之間經(jīng)由一系列分組交換機(jī)(路由器)路由分組。為了將一個(gè)分組從一個(gè)節(jié)點(diǎn)(主機(jī)或分組交換機(jī))移往其路徑上的下一個(gè)節(jié)點(diǎn),網(wǎng)絡(luò)層必須依賴由鏈路層提供的服務(wù)。鏈路層提供了對(duì)鏈路的管理,鏈路層提供的服務(wù)取決于應(yīng)用在鏈路

34、上的特定鏈路層協(xié)議。分組從源端到目的端一般需要經(jīng)過(guò)多個(gè)鏈路,每個(gè)分組沿其路徑到達(dá)不同鏈路是,可能有不同的鏈路層協(xié)議來(lái)處理。既是說(shuō),IP從不同的鏈路層協(xié)議獲取的服務(wù)會(huì)不一樣。</p><p>  鏈路層負(fù)責(zé)監(jiān)督相鄰網(wǎng)絡(luò)節(jié)點(diǎn)的信息流動(dòng),它使用檢錯(cuò)或糾錯(cuò)技術(shù)來(lái)確保正確的傳輸:當(dāng)鏈路檢測(cè)到錯(cuò)誤時(shí),它請(qǐng)求重發(fā),或是根據(jù)情況糾正。此外,鏈路層還要解決流量控制的問(wèn)題。</p><p><b>

35、  3)網(wǎng)絡(luò)層:</b></p><p>  網(wǎng)絡(luò)層提供越過(guò)多個(gè)網(wǎng)絡(luò)的選路功能,為端點(diǎn)提供無(wú)連接的數(shù)據(jù)報(bào)訪問(wèn),并定義端到端通過(guò)整個(gè)互聯(lián)網(wǎng)網(wǎng)絡(luò)的尋址功能。網(wǎng)絡(luò)層負(fù)責(zé)尋址、打包以及從一臺(tái)計(jì)算機(jī)通過(guò)一個(gè)或多個(gè)路由器到最終目標(biāo)的包轉(zhuǎn)發(fā)機(jī)制。網(wǎng)絡(luò)層的核心協(xié)議有:IP、ARP/RARP、ICMP和IGMP。IP協(xié)議(Internet protocol,簡(jiǎn)稱IP)是TCP/IP模型的核心,它是一個(gè)路由協(xié)議,負(fù)責(zé)IP

36、尋址、路由選擇、分段及包重組。</p><p><b>  4)傳輸層:</b></p><p>  傳輸層給應(yīng)用提供在其客戶端和服務(wù)器之間傳輸應(yīng)用層消息的服務(wù)。即傳輸層負(fù)責(zé)為兩個(gè)用戶進(jìn)程之間建立、管理和拆除可靠而又有效的端到端連接。傳輸層的核心協(xié)議是傳輸控制協(xié)議TCP(Transmission Control Protocol)和用戶數(shù)據(jù)報(bào)協(xié)議UDP(User Da

37、tagram Protocol)。TCP給其應(yīng)用提供面向連接的服務(wù),該服務(wù)包括應(yīng)用層消息往目的地有保證的遞送以及流量控制(既發(fā)送端和接收端之間速度的匹配)。TCP還把長(zhǎng)數(shù)據(jù)塊分割成較小的段,并提供擁塞控制機(jī)制。這樣當(dāng)網(wǎng)絡(luò)處于擁塞狀態(tài)時(shí),源端會(huì)抑制其發(fā)送速率。UDP協(xié)議給其應(yīng)用提供無(wú)連接的服務(wù),是一個(gè)幾乎沒(méi)有任何修飾的服務(wù)。</p><p><b>  5)應(yīng)用層:</b></p>

38、<p>  應(yīng)用層負(fù)責(zé)支持網(wǎng)絡(luò)應(yīng)用,直接與用戶或應(yīng)用程序通信,它給應(yīng)用程序提供訪問(wèn)其他層服務(wù)的能力并定義應(yīng)用程序用于交換數(shù)據(jù)的協(xié)議。應(yīng)用層包括許多協(xié)議,例如支持Web的HTTP、支持文件傳送的FTP、支持電子郵件的SMTP 協(xié)議都建立在這一層。</p><p>  TCP/IP應(yīng)用程序使用的應(yīng)用層接口有Windows套接字(Winsock)、NetBIOS等。Windows套接字提供Windows下

39、的標(biāo)準(zhǔn)應(yīng)用編程接口;NetBIOS是工業(yè)標(biāo)準(zhǔn)接口,用于訪問(wèn)協(xié)議服務(wù),如會(huì)話、數(shù)據(jù)報(bào)和名字解析等。</p><p>  Internet 的核心層是網(wǎng)絡(luò)層和傳輸層,相應(yīng)的核心協(xié)議是IP協(xié)議和TCP協(xié)議。IP 協(xié)議的主要功能包括無(wú)連結(jié)數(shù)據(jù)報(bào)傳送﹑數(shù)據(jù)報(bào)尋徑以及差錯(cuò)處理三部分。IP協(xié)議的特點(diǎn)是點(diǎn)到點(diǎn)的,IP對(duì)等實(shí)體間的通信不經(jīng)過(guò)中間機(jī)器,對(duì)等實(shí)體所在的機(jī)器位于同一物理網(wǎng)絡(luò),對(duì)等機(jī)器之間有直接的物理連接。IP層的主要功能

40、是屏蔽下面物理層的差別,向上一層提供一致的數(shù)據(jù)格式。所有要傳輸?shù)臄?shù)據(jù),被按照一定的格式分組封裝層IP數(shù)據(jù)報(bào),數(shù)據(jù)報(bào)單元通過(guò)尋徑等機(jī)制進(jìn)行傳輸,在接收方數(shù)據(jù)報(bào)進(jìn)行重組,得到最初要傳送的數(shù)據(jù)。由于IP協(xié)議是不可靠的數(shù)據(jù)傳輸協(xié)議,由于網(wǎng)絡(luò)的擁塞而發(fā)生的數(shù)據(jù)丟失等情況是不可避免的,因此Internet 還必須有一定的控制重傳機(jī)制,這就是差錯(cuò)與控制報(bào)文協(xié)議(ICMP)。</p><p>  盡管計(jì)算機(jī)通過(guò)安裝IP軟件,從而

41、保證了計(jì)算機(jī)之間可以發(fā)送和接收數(shù)據(jù),但I(xiàn)P協(xié)議還不能解決數(shù)據(jù)分組在傳輸過(guò)程中可能出現(xiàn)的問(wèn)題。因此,若要解決可能出現(xiàn)的問(wèn)題,還需要TCP協(xié)議來(lái)提供可靠的并且無(wú)差錯(cuò)的通信服務(wù)。TCP協(xié)議被稱作一種端對(duì)端協(xié)議。這是因?yàn)樗鼮閮膳_(tái)計(jì)算機(jī)之間的連接起了重要作用:當(dāng)一臺(tái)計(jì)算機(jī)需要與另一臺(tái)遠(yuǎn)程計(jì)算機(jī)連接時(shí),TCP協(xié)議會(huì)讓它們建立一個(gè)連接、發(fā)送和接收數(shù)據(jù)以及終止連接。傳輸控制協(xié)議TCP協(xié)議利用重發(fā)技術(shù)和擁塞控制機(jī)制,向應(yīng)用程序提供可靠的通信連接,使它能夠

42、自動(dòng)適應(yīng)網(wǎng)上的各種變化。即使在 Internet 暫時(shí)出現(xiàn)堵塞的情況下,TCP也能夠保證通信的可靠?;ヂ?lián)網(wǎng)是一個(gè)龐大的國(guó)際性網(wǎng)絡(luò),網(wǎng)路上的擁擠和空閑時(shí)間總是交替不定的,加上傳送的距離也遠(yuǎn)近不同,所以傳輸數(shù)據(jù)所用時(shí)間也會(huì)變化不定。TCP協(xié)議具有自動(dòng)調(diào)整"超時(shí)值"的功能,能很好地適應(yīng) Internet 上各種各樣的變化,確保傳輸數(shù)值的正確。</p><p>  IP協(xié)議只保證計(jì)算機(jī)能發(fā)送和接收分組

43、數(shù)據(jù),而TCP協(xié)議則可提供一個(gè)可靠的、可流控的、全雙工的信息流傳輸服務(wù)。雖然IP和TCP這兩個(gè)協(xié)議的功能不盡相同,也可以分開(kāi)單獨(dú)使用,但它們是在同一時(shí)期作為一個(gè)協(xié)議來(lái)設(shè)計(jì)的,并且在功能上也是互補(bǔ)的。只有兩者的結(jié)合,才能保證 Internet 在復(fù)雜的環(huán)境下正常運(yùn)行。凡是要連接到 Internet 的計(jì)算機(jī),都必須同時(shí)安裝和使用這兩個(gè)協(xié)議,因此在實(shí)際中常把這兩個(gè)協(xié)議統(tǒng)稱作TCP/IP協(xié)議。</p><p>  2.

44、2 Socket技術(shù)</p><p>  2.2.1 Socket基本概念</p><p>  20世紀(jì)80年代初,美國(guó)政府的高級(jí)研究機(jī)構(gòu)(ARPA)給加利福尼亞大學(xué)Berkeley分校提供資金,讓他們?cè)赨NIX操作系統(tǒng)下實(shí)現(xiàn)TCP/IP協(xié)議。在這個(gè)項(xiàng)目中,研究人員為TCP/IP網(wǎng)絡(luò)通信開(kāi)發(fā)了API(應(yīng)用程序接口)。這個(gè)API稱為Socket接口。如今Socket接口是TCP/IP網(wǎng)絡(luò)最為

45、通用的API,也是在Internet上進(jìn)行應(yīng)用開(kāi)發(fā)最為通用的API。</p><p>  Internet是有不同種類的網(wǎng)絡(luò)互連而成,實(shí)現(xiàn)不同網(wǎng)絡(luò)及計(jì)算機(jī)之間交互操作的關(guān)鍵問(wèn)題是由TCP/IP協(xié)議來(lái)解決的。TCP/IP協(xié)議的核心是傳輸層協(xié)議(TCP和UDP)、網(wǎng)絡(luò)層協(xié)議(IP)和網(wǎng)絡(luò)接口層,前兩層在操作系統(tǒng)內(nèi)核中實(shí)現(xiàn)。操作系統(tǒng)內(nèi)核是不能直接為一般用戶所感受到的,一般用戶感受到的只有應(yīng)用程序(包括系統(tǒng)應(yīng)用程序),即

46、各種應(yīng)用程序構(gòu)成了操作系統(tǒng)的用戶視圖。兩者之間的接口是網(wǎng)絡(luò)編程界面(程序員界面)。因此,TCP/IP網(wǎng)絡(luò)環(huán)境下的應(yīng)用程序也不是直接與TCP/IP核心打交道,而是與網(wǎng)絡(luò)應(yīng)用編程接口(套接字,socket)打交道,編程接口構(gòu)成了核心協(xié)議的用戶視圖。</p><p>  實(shí)際上,Socket在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過(guò)這個(gè)端口與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過(guò)這

47、個(gè)Socket接口來(lái)實(shí)現(xiàn)。在應(yīng)用開(kāi)發(fā)中,就像使用文件句柄一樣,可以對(duì)Socket句柄進(jìn)行讀、寫(xiě)操作。可以把Socket看成是一根連接線,當(dāng)在兩臺(tái)計(jì)算機(jī)之間建立了一個(gè)Socket之后,兩臺(tái)計(jì)算機(jī)就可以通過(guò)這根連接線來(lái)完成信息交互,所做的僅僅是向這根連接線里寫(xiě)入數(shù)據(jù),再?gòu)钠渲凶x出數(shù)據(jù),而不必?fù)?dān)心會(huì)不會(huì)由信息丟失,Socket會(huì)負(fù)責(zé)照看好數(shù)據(jù)。</p><p>  Socket用于表達(dá)兩臺(tái)機(jī)器之間的連接‘終端’。一個(gè)網(wǎng)

48、絡(luò)應(yīng)用涉及兩臺(tái)(或兩臺(tái)以上)不同主機(jī)中跨網(wǎng)絡(luò)彼此通信的兩個(gè)進(jìn)程。這兩個(gè)進(jìn)程通過(guò)經(jīng)由各自的套接字(Socket)發(fā)送和接收消息彼此通信。對(duì)于一個(gè)給定的連接,每臺(tái)機(jī)器上都有一個(gè)套接字。有點(diǎn)像我們打電話,用電纜把電話連接起來(lái),中間的物理結(jié)構(gòu)和具體實(shí)現(xiàn)過(guò)程我們不必了解,只要我們能進(jìn)行通話即可。套接字是單臺(tái)主機(jī)內(nèi)應(yīng)用層和傳輸層之間的接口。套接字也用于指代應(yīng)用程序和網(wǎng)絡(luò)之間的應(yīng)用程序接口(application program interface,

49、簡(jiǎn)稱API),因?yàn)樗质怯糜跇?gòu)造互聯(lián)網(wǎng)中的網(wǎng)絡(luò)應(yīng)用程序的編程接口。當(dāng)我們進(jìn)行編程時(shí),需要用到Socket接口,Socket接口定義了許多函數(shù)或例程,我們可以直接調(diào)用它們實(shí)現(xiàn)網(wǎng)絡(luò)連接、通信等功能。Socket接口為我們建立通信信道,我們可以通過(guò)這條通道來(lái)與一臺(tái)或多臺(tái)計(jì)算機(jī)進(jìn)行連接。</p><p>  套接字屏蔽了底層通信軟件和具體操作系統(tǒng)的差異,使得任何兩臺(tái)安裝了TCP協(xié)議軟件和實(shí)現(xiàn)了套接字規(guī)范的計(jì)算機(jī)之間的通信

50、成為可能。對(duì)于應(yīng)用程序來(lái)說(shuō),它就像一個(gè)服務(wù)協(xié)議插座一樣,各種不同的協(xié)議,對(duì)應(yīng)不同的端口。</p><p>  我們可以把套接字看作相應(yīng)進(jìn)程上的“門”:進(jìn)程把消息發(fā)送到網(wǎng)絡(luò)或從網(wǎng)絡(luò)接收消息都得經(jīng)過(guò)自身得套接字。當(dāng)一個(gè)進(jìn)程想給另一臺(tái)主機(jī)中的另一個(gè)進(jìn)程發(fā)送消息是,它就把該消息推出自家的門。該進(jìn)程認(rèn)定在這扇門的另一側(cè)有一個(gè)傳輸設(shè)施會(huì)把這個(gè)消息傳輸?shù)侥康倪M(jìn)程的門口。在服務(wù)器進(jìn)程處于運(yùn)行狀態(tài)的情況下,客戶進(jìn)程就能夠初始化一個(gè)

51、到服務(wù)器的TCP連接了,這是通過(guò)在客戶程序中創(chuàng)建一個(gè)套接字對(duì)象來(lái)完成的,當(dāng)客戶創(chuàng)建了它的套接字對(duì)象的時(shí)候,它詳細(xì)說(shuō)明了服務(wù)器進(jìn)程的地址,也就是,服務(wù)器的IP地址和進(jìn)程的端口號(hào),一旦創(chuàng)建了套接字對(duì)象,客戶端的TCP就發(fā)起一個(gè)三次握手,并建立一個(gè)和服務(wù)器的TCP連接,三次握手對(duì)客戶和服務(wù)器程序來(lái)說(shuō)是完全透明的。</p><p>  2.2.2 Socket類型及規(guī)范</p><p>  可以提

52、供給用戶使用的套接字有兩種,它們分別是數(shù)據(jù)報(bào)套接字和流式套接字:</p><p>  1)流式套接字(SOCKET_STREAM)</p><p>  提供了面向連接、雙向可靠的數(shù)據(jù)流傳輸服務(wù),數(shù)據(jù)無(wú)出錯(cuò),無(wú)重復(fù)地發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無(wú)長(zhǎng)度限制。</p><p>  流式套接字使用傳輸控制協(xié)議(TCP)。它提供了一

53、種可靠的,面向連接的數(shù)據(jù)傳輸方式。通?;谶B接的流式套接字是設(shè)計(jì)客戶機(jī)/服務(wù)器應(yīng)用程序時(shí)的標(biāo)準(zhǔn)。流式套接字主要用于大批量數(shù)據(jù)或者讓數(shù)據(jù)按順序無(wú)重復(fù)的到達(dá)目的地而使用</p><p>  2)數(shù)據(jù)報(bào)式套接字(SOCKET_DGRAM)</p><p>  提供了無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立形式被發(fā)送,不提供無(wú)錯(cuò)保證,數(shù)據(jù)可能丟失或者重復(fù),并且接收順序無(wú)序。數(shù)據(jù)報(bào)套接字使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP)

54、。實(shí)際使用中,同一個(gè)分組數(shù)據(jù)報(bào)可能不止一次的被發(fā)送,一般要等到接收方發(fā)回確認(rèn)收到的消息才會(huì)停止發(fā)送。</p><p>  一般有兩種套接字規(guī)范:一種是針對(duì)UNIX系統(tǒng)的Berkely Socket規(guī)范;一種是占主流地位的Windows sockets(簡(jiǎn)稱WinSock)規(guī)范,它是Microsoft 以Berkely Socket規(guī)范為范例開(kāi)發(fā)的windows下的網(wǎng)絡(luò)編程接口。</p><p&

55、gt;  Windows socket規(guī)范定義并記錄了如何使用API與Internet協(xié)議相連接,且所有的Windows socket實(shí)現(xiàn)都支持流式套接字和數(shù)據(jù)報(bào)套接字。應(yīng)用程序調(diào)用Windows socket的API實(shí)現(xiàn)相互之間的通信。Windows socket又利用下層的網(wǎng)絡(luò)通信協(xié)議功能和操作系統(tǒng)調(diào)用實(shí)現(xiàn)實(shí)際的通信工作。</p><p>  2.2.3 Win Socket API</p>&

56、lt;p>  本文在軟件實(shí)現(xiàn)上使用的Socket函數(shù)正是Windows Socket API。下面介紹幾個(gè)重要的API:</p><p>  一) WSAStartup函數(shù) </p><p>  int WSAStartup( </p><p>  WORD wVersionRequested, </p><p>  LPWSADAT

57、A lpWSAData </p><p><b>  ); </b></p><p>  使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。該函數(shù)的第一個(gè)參數(shù)指明程序請(qǐng)求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二個(gè)參數(shù)返回請(qǐng)求的Socket的版本信息。當(dāng)一個(gè)應(yīng)用程序調(diào)用WSAStartup函數(shù)時(shí),操

58、作系統(tǒng)根據(jù)請(qǐng)求的Socket版本來(lái)搜索相應(yīng)的Socket庫(kù),然后綁定找到的Socket庫(kù)到該應(yīng)用程序中。以后應(yīng)用程序就可以調(diào)用所請(qǐng)求的Socket庫(kù)中的其它Socket函數(shù)了。該函數(shù)執(zhí)行成功后返回0。 </p><p>  例:假如一個(gè)程序要使用2.1版本的Socket,那么程序代碼如下 </p><p>  wVersionRequested = MAKEWORD( 2, 1 ); &l

59、t;/p><p>  err = WSAStartup( wVersionRequested, &wsaData ); </p><p>  二) WSACleanup函數(shù) </p><p>  int WSACleanup (void); </p><p>  應(yīng)用程序在完成對(duì)請(qǐng)求的Socket庫(kù)的使用后,要調(diào)用WSACleanup函數(shù)

60、來(lái)解除與Socket庫(kù)的綁定并且釋放Socket庫(kù)所占用的系統(tǒng)資源。 </p><p>  三) socket函數(shù) </p><p>  SOCKET socket( int af, int type, int protocol ); </p><p>  應(yīng)用程序調(diào)用socket函數(shù)來(lái)創(chuàng)建一個(gè)能夠進(jìn)行網(wǎng)絡(luò)通信的套接字。第一個(gè)參數(shù)指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,

61、對(duì)于TCP/IP協(xié)議族,該參數(shù)置PF_INET;第二個(gè)參數(shù)指定要?jiǎng)?chuàng)建的套接字類型,流套接字類型為SOCK_STREAM、數(shù)據(jù)報(bào)套接字類型為SOCK_DGRAM;第三個(gè)參數(shù)指定應(yīng)用程序所使用的通信協(xié)議。該函數(shù)如果調(diào)用成功就返回新創(chuàng)建的套接字的描述符,如果失敗就返回INVALID_SOCKET。套接字描述符是一個(gè)整數(shù)類型的值。每個(gè)進(jìn)程的進(jìn)程空間里都有一個(gè)套接字描述符表,該表中存放著套接字描述符和套接字?jǐn)?shù)據(jù)結(jié)構(gòu)的對(duì)應(yīng)關(guān)系。該表中有一個(gè)字段存放

62、新創(chuàng)建的套接字的描述符,另一個(gè)字段存放套接字?jǐn)?shù)據(jù)結(jié)構(gòu)的地址,因此根據(jù)套接字描述符就可以找到其對(duì)應(yīng)的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)。每個(gè)進(jìn)程在自己的進(jìn)程空間里都有一個(gè)套接字描述符表但是套接字?jǐn)?shù)據(jù)結(jié)構(gòu)都是在操作系統(tǒng)的內(nèi)核緩沖里。下面是一個(gè)創(chuàng)建流套接字的例子: </p><p>  struct protoent *ppe; </p><p>  ppe=getprotobyname("tcp&quo

63、t;); </p><p>  SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto); </p><p>  四) closesocket函數(shù) </p><p>  int closesocket( SOCKET s ); </p><p>  closesocket函

64、數(shù)用來(lái)關(guān)閉一個(gè)描述符為s套接字。由于每個(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)。套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中專門有一個(gè)字段存放該結(jié)構(gòu)的被引用次數(shù),即有多少個(gè)套接字描述符指向該結(jié)構(gòu)。當(dāng)調(diào)用closesocket函數(shù)時(shí),操作系統(tǒng)先檢查套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中的該字段的值,如果為1,就表明只有一個(gè)套接字描述符指向它,因此操作系統(tǒng)就先把s在套接字描述

65、符表中對(duì)應(yīng)的那條表項(xiàng)清除,并且釋放s對(duì)應(yīng)的套接字?jǐn)?shù)據(jù)結(jié)構(gòu);如果該字段大于1,那么操作系統(tǒng)僅僅清除s在套接字描述符表中的對(duì)應(yīng)表項(xiàng),并且把s對(duì)應(yīng)的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)的引用次數(shù)減1。</p><p>  closesocket函數(shù)如果執(zhí)行成功就返回0,否則返回SOCKET_ERROR。</p><p>  五) send函數(shù) </p><p>  int send( SOCK

66、ET s, const char FAR *buf, int len, int flags ); </p><p>  不論是客戶還是服務(wù)器應(yīng)用程序都用send函數(shù)來(lái)向TCP連接的另一端發(fā)送數(shù)據(jù)??蛻舫绦蛞话阌胹end函數(shù)向服務(wù)器發(fā)送請(qǐng)求,而服務(wù)器則通常用send函數(shù)來(lái)向客戶程序發(fā)送應(yīng)答。該函數(shù)的第一個(gè)參數(shù)指定發(fā)送端套接字描述符;第二個(gè)參數(shù)指明一個(gè)存放應(yīng)用程序要發(fā)送數(shù)據(jù)的緩沖區(qū);第三個(gè)參數(shù)指明實(shí)際要發(fā)送的數(shù)據(jù)的字

67、節(jié)數(shù);第四個(gè)參數(shù)一般置0。這里只描述同步Socket的send函數(shù)的執(zhí)行流程。當(dāng)調(diào)用該函數(shù)時(shí),send先比較待發(fā)送數(shù)據(jù)的長(zhǎng)度len和套接字s的發(fā)送緩沖區(qū)的長(zhǎng)度,如果len大于s的發(fā)送緩沖區(qū)的長(zhǎng)度,該函數(shù)返回SOCKET_ERROR;如果len小于或者等于s的發(fā)送緩沖區(qū)的長(zhǎng)度,那么send先檢查協(xié)議是否正在發(fā)送s的發(fā)送緩沖中的數(shù)據(jù),如果是就等待協(xié)議把數(shù)據(jù)發(fā)送完,如果協(xié)議還沒(méi)有開(kāi)始發(fā)送s的發(fā)送緩沖中的數(shù)據(jù)或者s的發(fā)送緩沖中沒(méi)有數(shù)據(jù),那么se

68、nd就比較s的發(fā)送緩沖區(qū)的剩余空間和len,如果len大于剩余空間大小send就一直等待協(xié)議把s的發(fā)送緩沖中的數(shù)據(jù)發(fā)送完,如果len小于剩余空間大小send就僅僅把buf中的數(shù)據(jù)copy到剩余空間里(注意并不是send把s的發(fā)送緩沖中的數(shù)據(jù)傳到連接的另一端的,而是</p><p>  注意:在Unix系統(tǒng)下,如果send在等待協(xié)議傳送數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開(kāi)的話,調(diào)用send的進(jìn)程會(huì)接收到一個(gè)SIGPIPE信號(hào),進(jìn)程對(duì)該信

69、號(hào)的默認(rèn)處理是進(jìn)程終止。 </p><p>  六) recv函數(shù) </p><p>  int recv( SOCKET s, char FAR *buf, int len, int flags ); </p><p>  不論是客戶還是服務(wù)器應(yīng)用程序都用recv函數(shù)從TCP連接的另一端接收數(shù)據(jù)。該函數(shù)的第一個(gè)參數(shù)指定接收端套接字描述符;第二個(gè)參數(shù)指明一個(gè)緩沖區(qū),

70、該緩沖區(qū)用來(lái)存放recv函數(shù)接收到的數(shù)據(jù);第三個(gè)參數(shù)指明buf的長(zhǎng)度;第四個(gè)參數(shù)一般置0。這里只描述同步Socket的recv函數(shù)的執(zhí)行流程。當(dāng)應(yīng)用程序調(diào)用recv函數(shù)時(shí),recv先等待s的發(fā)送緩沖中的數(shù)據(jù)被協(xié)議傳送完畢,如果協(xié)議在傳送s的發(fā)送緩沖中的數(shù)據(jù)時(shí)出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤,那么recv函數(shù)返回SOCKET_ERROR,如果s的發(fā)送緩沖中沒(méi)有數(shù)據(jù)或者數(shù)據(jù)被協(xié)議成功發(fā)送完畢后,recv先檢查套接字s的接收緩沖區(qū),如果s接收緩沖區(qū)中沒(méi)有數(shù)據(jù)或者

71、協(xié)議正在接收數(shù)據(jù),那么recv就一直等待,只到協(xié)議把數(shù)據(jù)接收完畢。當(dāng)協(xié)議把數(shù)據(jù)接收完畢,recv函數(shù)就把s的接收緩沖中的數(shù)據(jù)copy到buf中(注意協(xié)議接收到的數(shù)據(jù)可能大于buf的長(zhǎng)度,所以在這種情況下要調(diào)用幾次recv函數(shù)才能把s的接收緩沖中的數(shù)據(jù)copy完。recv函數(shù)僅僅是copy數(shù)據(jù),真正的接收數(shù)據(jù)是協(xié)議來(lái)完成的),recv函數(shù)返回其實(shí)際copy的字節(jié)數(shù)。如果recv在copy時(shí)出錯(cuò),那么它返回SOCKET</p>

72、<p>  注意:在Unix系統(tǒng)下,如果recv函數(shù)在等待協(xié)議接收數(shù)據(jù)時(shí)網(wǎng)絡(luò)斷開(kāi)了,那么調(diào)用recv的進(jìn)程會(huì)接收到一個(gè)SIGPIPE信號(hào),進(jìn)程對(duì)該信號(hào)的默認(rèn)處理是進(jìn)程終止。 </p><p>  七) bind函數(shù) </p><p>  int bind( SOCKET s, const struct sockaddr FAR *name, int namelen ); <

73、;/p><p>  當(dāng)創(chuàng)建了一個(gè)Socket以后,套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中有一個(gè)默認(rèn)的IP地址和默認(rèn)的端口號(hào)。一個(gè)服務(wù)程序必須調(diào)用bind函數(shù)來(lái)給其綁定一個(gè)IP地址和一個(gè)特定的端口號(hào)。客戶程序一般不必調(diào)用bind函數(shù)來(lái)為其Socket綁定IP地址和斷口號(hào)。該函數(shù)的第一個(gè)參數(shù)指定待綁定的Socket描述符;第二個(gè)參數(shù)指定一個(gè)sockaddr結(jié)構(gòu),該結(jié)構(gòu)是這樣定義的: </p><p>  struct

74、sockaddr { </p><p>  u_short sa_family; </p><p>  char sa_data[14]; </p><p><b>  }; </b></p><p>  sa_family指定地址族,對(duì)于TCP/IP協(xié)議族的套接字,給其置AF_INET。當(dāng)對(duì)TCP/IP協(xié)議族的套接字進(jìn)

75、行綁定時(shí),我們通常使用另一個(gè)地址結(jié)構(gòu): </p><p>  struct sockaddr_in { </p><p>  short sin_family; </p><p>  u_short sin_port; </p><p>  struct in_addr sin_addr; </p><p>  cha

76、r sin_zero[8]; </p><p><b>  }; </b></p><p>  其中sin_family置AF_INET;sin_port指明端口號(hào);sin_addr結(jié)構(gòu)體中只有一個(gè)唯一的字段s_addr,表示IP地址,該字段是一個(gè)整數(shù),一般用函數(shù)inet_addr()把字符串形式的IP地址轉(zhuǎn)換成unsigned long型的整數(shù)值后再置給s_addr

77、。有的服務(wù)器是多宿主機(jī),至少有兩個(gè)網(wǎng)卡,那么運(yùn)行在這樣的服務(wù)器上的服務(wù)程序在為其Socket綁定IP地址時(shí)可以把htonl(INADDR_ANY)置給s_addr,這樣做的好處是不論哪個(gè)網(wǎng)段上的客戶程序都能與該服務(wù)程序通信;如果只給運(yùn)行在多宿主機(jī)上的服務(wù)程序的Socket綁定一個(gè)固定的IP地址,那么就只有與該IP地址處于同一個(gè)網(wǎng)段上的客戶程序才能與該服務(wù)程序通信。我們用0來(lái)填充sin_zero數(shù)組,目的是讓sockaddr_in結(jié)構(gòu)的大

78、小與sockaddr結(jié)構(gòu)的大小一致。下面是一個(gè)bind函數(shù)調(diào)用的例子: </p><p>  struct sockaddr_in saddr; </p><p>  saddr.sin_family = AF_INET; </p><p>  saddr.sin_port = htons(8888); </p><p>  saddr.si

79、n_addr.s_addr = htonl(INADDR_ANY); </p><p>  bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr)); </p><p>  八) listen函數(shù) </p><p>  int listen( SOCKET s, int backlog ); <

80、;/p><p>  服務(wù)程序可以調(diào)用listen函數(shù)使其流套接字s處于監(jiān)聽(tīng)狀態(tài)。處于監(jiān)聽(tīng)狀態(tài)的流套接字s將維護(hù)一個(gè)客戶連接請(qǐng)求隊(duì)列,該隊(duì)列最多容納backlog個(gè)客戶連接請(qǐng)求。假如該函數(shù)執(zhí)行成功,則返回0;如果執(zhí)行失敗,則返回SOCKET_ERROR。 </p><p>  九) accept函數(shù) </p><p>  SOCKET accept( SOCKET s,

81、struct sockaddr FAR *addr, int FAR *addrlen ); </p><p>  服務(wù)程序調(diào)用accept函數(shù)從處于監(jiān)聽(tīng)狀態(tài)的流套接字s的客戶連接請(qǐng)求隊(duì)列中取出排在最前的一個(gè)客戶請(qǐng)求,并且創(chuàng)建一個(gè)新的套接字來(lái)與客戶套接字創(chuàng)建連接通道,如果連接成功,就返回新創(chuàng)建的套接字的描述符,以后與客戶套接字交換數(shù)據(jù)的是新創(chuàng)建的套接字;如果失敗就返回INVALID_SOCKET。該函數(shù)的第一個(gè)參

82、數(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è)調(diào)用accept的例子: </p><p>  struct sockaddr_in ServerSocketAddr; </p><p>  int addrlen; </p><p>  addrlen=siz

83、eof(ServerSocketAddr); </p><p>  ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen); </p><p>  十) connect函數(shù) </p><p>  int connect( SOCKET s, con

84、st struct sockaddr FAR *name, int namelen ); </p><p>  客戶程序調(diào)用connect函數(shù)來(lái)使客戶Socket s與監(jiān)聽(tīng)于name所指定的計(jì)算機(jī)的特定端口上的服務(wù)Socket進(jìn)行連接。如果連接成功,connect返回0;如果失敗則返回SOCKET_ERROR。下面是一個(gè)例子: </p><p>  struct sockaddr_in d

85、addr; </p><p>  memset((void *)&daddr,0,sizeof(daddr));</p><p>  daddr.sin_family=AF_INET; </p><p>  daddr.sin_port=htons(8888); </p><p>  daddr.sin_addr.s_addr=ine

86、t_addr("133.197.22.4"); </p><p>  connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr));</p><p>  2.3 Win32編程技術(shù)</p><p>  win32 是指Window都是32位的操作系統(tǒng),例如98、XP、2000、

87、2003等操作系統(tǒng), Win32編程就是在這些系統(tǒng)下的編程,運(yùn)用Window提供的API(Application Programming Interface)為Window編寫(xiě)應(yīng)用程序。 win32編程可以用C來(lái)完成,主要是通過(guò)Windows的API來(lái)工作。然而更方便的是使用MFC,微軟基礎(chǔ)類(Microsoft Foundation Classes),實(shí)際上是微軟提供的,用于在C++環(huán)境下編寫(xiě)應(yīng)用程序的一個(gè)框架和引擎,VC++是Win

88、dows下開(kāi)發(fā)人員使用的專業(yè)C++ SDK(SDK, Standard Software Develop Kit,專業(yè)軟件開(kāi)發(fā)平臺(tái)),MFC就是掛在它之上的一個(gè)輔助軟件開(kāi)發(fā)包,MFC作為與VC++血肉相連的部分,可以大大方便程序員,簡(jiǎn)化程序員的工作。</p><p>  MFC是Win API與C++的結(jié)合,API,即微軟提供的Windows下應(yīng)用程序的編程語(yǔ)言接口,是一種軟件編程的規(guī)范,但不是一種程序開(kāi)發(fā)語(yǔ)言本

89、身,可以允許用戶使用各種各樣的第三方的編程語(yǔ)言來(lái)進(jìn)行對(duì)Windows下應(yīng)用程序的開(kāi)發(fā),使這些被開(kāi)發(fā)出來(lái)的應(yīng)用程序能在Windows下運(yùn)行,比如VB, VC++, Java, Delphi編程語(yǔ)言函數(shù)本質(zhì)上全部源于API,因此用它們開(kāi)發(fā)出來(lái)的應(yīng)用程序都能工作在Windows的消息機(jī)制和繪圖里,遵守Windows作為一個(gè)操作系統(tǒng)的內(nèi)部實(shí)現(xiàn)。上面說(shuō)到MFC是微軟對(duì)API函數(shù)的專用C++封裝,這種結(jié)合一方面讓用戶使用微軟的專業(yè)C++ SDK來(lái)進(jìn)

90、行Windows下應(yīng)用程序的開(kāi)發(fā)變得容易,因?yàn)镸FC是對(duì)API的封裝,微軟做了大量的工作,隱藏了好多內(nèi)節(jié)程序開(kāi)發(fā)人員在Windows下用C++ & MFC編制軟件時(shí)的大量?jī)?nèi)節(jié),如應(yīng)用程序?qū)崿F(xiàn)消息的處理,設(shè)備環(huán)境繪圖,這種結(jié)合是以方便為目的的,必定要付出一定代價(jià),因此就造成了MFC對(duì)類封裝中的一定程度的的冗余和迂回,但這是可以接收的。</p><p><b>  3系統(tǒng)的設(shè)計(jì)</b>&

91、lt;/p><p><b>  3.1系統(tǒng)設(shè)計(jì)目標(biāo)</b></p><p>  本程序設(shè)計(jì)意圖是為了更好的管理局域網(wǎng)內(nèi)電腦的使用,對(duì)電腦的使用進(jìn)行實(shí)時(shí)的監(jiān)控,為局域網(wǎng)內(nèi)部提供一個(gè)良好的運(yùn)行環(huán)境。因此,該系統(tǒng)應(yīng)該具有下列功能:</p><p>  1)能隨時(shí)查看某個(gè)主機(jī)的屏幕畫(huà)面,即能進(jìn)行屏幕截圖。此功能是為了防止有人使用電腦做一些違法微機(jī)室管理?xiàng)l例

92、的事情,在已經(jīng)違反后,可以作為證據(jù)使其無(wú)法抵賴。</p><p>  2)能隨時(shí)鎖定和解鎖用戶電腦。所謂“鎖定”是指讓用戶無(wú)法進(jìn)行鍵盤(pán)輸入和鼠標(biāo)操作,使電腦暫時(shí)“失靈”,該功能主要用于強(qiáng)迫用戶下機(jī)。而解鎖就是將已經(jīng)鎖定的電腦恢復(fù)正常。</p><p>  3)能查看用戶電腦中正在運(yùn)行的進(jìn)程,并關(guān)閉選中的進(jìn)程。該功能可以用于設(shè)定某些程序無(wú)法執(zhí)行(比如一些被禁止的游戲等),同時(shí),也可以從一定程

93、度上起到病毒防治作用。</p><p>  4)能為用戶設(shè)定使用時(shí)間。即控制用戶的使用電腦的時(shí)間。</p><p>  5)能向用戶發(fā)送消息。管理員可以從服務(wù)器上直接發(fā)送一些消息到用戶電腦上,比如對(duì)用戶的違規(guī)行為進(jìn)行警告,對(duì)時(shí)間快要用盡的用戶進(jìn)行提醒等。</p><p>  6)能同時(shí)支持多個(gè)客戶端。即一臺(tái)服務(wù)器就能管理多個(gè)客戶端,一般上限應(yīng)不低于250臺(tái)。<

94、/p><p>  7)能方便的實(shí)現(xiàn)以上操作。要求程序界面友好,安裝及維護(hù)簡(jiǎn)易可行。</p><p><b>  3.2系統(tǒng)架構(gòu)設(shè)計(jì)</b></p><p>  按照前面提出的設(shè)計(jì)目標(biāo)來(lái)看,該系統(tǒng)是一個(gè)典型的C/S系統(tǒng),其架構(gòu)圖如下所示:</p><p><b>  圖3-1 系統(tǒng)框圖</b></p

95、><p>  在該系統(tǒng)中,管理員通過(guò)一臺(tái)服務(wù)器,對(duì)多個(gè)客戶端進(jìn)行控制。而這些控制的實(shí)現(xiàn),都是通過(guò)向客戶端發(fā)送消息來(lái)實(shí)現(xiàn)的。下面詳細(xì)介紹一下這些控制協(xié)議。</p><p>  1)用戶登錄??蛻舳溯斎敕?wù)器的ip和自身的用戶名及密碼,作為L(zhǎng)OGIN命令的參數(shù)發(fā)送到服務(wù)器端。若用戶名和密碼正確,將返回OK,否則返回NO。</p><p><b>  圖3-2 用戶

96、登錄</b></p><p>  2)鎖定和解鎖。服務(wù)器端向客戶端發(fā)送LOCK命令,客戶端將嘗試鎖定屏幕,如果成功,將向服務(wù)器返回OK,否則返回NO;服務(wù)器端向客戶端發(fā)送UNLOCK命令,客戶端將嘗試解除鎖定屏幕,如果成功,將向服務(wù)器返回OK,否則返回NO。</p><p>  圖3-3 鎖定和解鎖</p><p>  3)發(fā)送消息。服務(wù)器端通過(guò)發(fā)送命令

97、MSG向客戶端發(fā)送消息。消息的具體內(nèi)容作為參數(shù)msg傳遞給客戶端,客戶端在收到后返回OK給服務(wù)器端。</p><p><b>  圖3-4 發(fā)送消息</b></p><p>  4)屏幕截圖。服務(wù)器端通過(guò)SNAP命令向客戶端要求截圖,客戶端進(jìn)行截圖嘗試,如失敗,將返回NO;如果成功,將返回OK len命令,將圖像數(shù)據(jù)大小從len參數(shù)中傳遞給服務(wù)器端,并接著傳遞所得圖像

98、的數(shù)據(jù)給服務(wù)器。</p><p><b>  圖3-5 屏幕截圖</b></p><p>  5)查看進(jìn)程。服務(wù)器向客戶端發(fā)送LIST命令,客戶端嘗試進(jìn)行進(jìn)程枚舉,如果失敗,將返回NO給服務(wù)器;如果成功,將發(fā)送OK len命令給服務(wù)器,len參數(shù)指名了進(jìn)程信息的數(shù)據(jù)大小。接下來(lái)就將把進(jìn)程信息發(fā)送到服務(wù)器端。</p><p><b> 

99、 圖3-6 查看進(jìn)程</b></p><p>  6)心跳包。所謂心跳包就是在客戶端和服務(wù)器間定時(shí)通知對(duì)方自己狀態(tài)的一個(gè)自己定義的命令字,按照一定的時(shí)間間隔發(fā)送,類似于心跳,所以叫做心跳包。通過(guò)使用心跳包,就能知道客戶端和服務(wù)器端是否還相連。在本協(xié)議中,服務(wù)器將定時(shí)發(fā)送ALIVE命令給每個(gè)客戶端,客戶端在收到后回復(fù)OK給服務(wù)器端。</p><p><b>  圖3-6

100、 心跳包</b></p><p>  整個(gè)系統(tǒng)的運(yùn)作流程如下面兩圖所示: </p><p>  圖3-7 服務(wù)器流程圖</p><p>  圖3-8 客戶端流程圖</p><p>  服務(wù)器端在程序開(kāi)始運(yùn)行后,一方面啟動(dòng)了監(jiān)聽(tīng)線程,不停的準(zhǔn)備接收新的客戶端的連接請(qǐng)求。如果客戶端發(fā)送來(lái)的用戶合法,那么將這個(gè)新的客戶端添加到管理集合中

101、。另一方面,服務(wù)器端隨時(shí)接收管理員的管理操作,比如針對(duì)某個(gè)ip的電腦進(jìn)行截圖操作等。當(dāng)用戶選擇終止程序時(shí)將退出。</p><p>  客戶端在程序運(yùn)行后會(huì)首先鎖定屏幕,只有當(dāng)?shù)卿浄?wù)器成功后才會(huì)解除鎖定。在登錄成功后,客戶端就不停的監(jiān)聽(tīng)來(lái)自服務(wù)器的消息,并對(duì)消息進(jìn)行響應(yīng)(可能會(huì)在本地進(jìn)行很多操作),然后把結(jié)果返回到服務(wù)器端。</p><p><b>  4系統(tǒng)的實(shí)現(xiàn)</b&

102、gt;</p><p>  4.1用戶界面的實(shí)現(xiàn)</p><p>  如下圖所示,用戶界面為友好的Win32應(yīng)用程序,在服務(wù)器程序界面左邊??康墓ぞ邨l中,有一個(gè)樹(shù)控件,該控件列出了系統(tǒng)中正在管理的客戶端ip。選中其中的某個(gè),就可以進(jìn)行響應(yīng)的操作,比如“截取屏幕”,那么就可以獲取客戶端的屏幕畫(huà)面,并顯示到用戶界面中。</p><p>  圖4-1 服務(wù)器端運(yùn)行效果圖&

103、lt;/p><p>  在客戶端,用戶被要求填入服務(wù)器ip,用戶名以及密碼,然后登錄。如下圖所示:</p><p>  圖4-2 客戶器端運(yùn)行效果圖</p><p>  4.2核心算法的實(shí)現(xiàn)</p><p>  由于整個(gè)系統(tǒng)基本使用MFC開(kāi)發(fā),而且涉及到很多方面,代碼量比較大,不可能一一介紹,下面選擇幾個(gè)較為重要的核心功能的實(shí)現(xiàn)進(jìn)行介紹。<

104、/p><p>  4.2.1客戶端和服務(wù)器端的通信</p><p>  無(wú)論是屏幕截圖還是鎖定屏幕,都是在服務(wù)器端管理員進(jìn)行命令,在客戶端進(jìn)行響應(yīng)。因此,之間涉及大量的網(wǎng)絡(luò)通信。在整個(gè)系統(tǒng)中,網(wǎng)絡(luò)通信至關(guān)重要,主要通過(guò)兩個(gè)類實(shí)現(xiàn):CClient和CServer。</p><p>  class CServer</p><p><b> 

105、 {</b></p><p><b>  public:</b></p><p>  bool Check(char* name, char* pass);</p><p>  bool UnlockScreen(char* ip);</p><p>  bool LockScreen(char* ip);&

106、lt;/p><p>  bool SendMsg(char* ip, char* msg);</p><p>  CString GetNextClientIP();</p><p>  void PreEnum();</p><p>  bool SnapScreen(char *ip, CxImage& x);</p>

107、<p>  void AliveAll();</p><p>  void AddClient(const Client &client);</p><p>  void Run();</p><p><b>  CServer()</b></p><p><b>  { </b&g

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論