版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、畢畢 業(yè)業(yè) 設設 計計( 論論 文文) 機房監(jiān)控系統(tǒng)的設計與實現機房監(jiān)控系統(tǒng)的設計與實現 論文作者姓名:論文作者姓名: 申請學位專業(yè):申請學位專業(yè): 申請學位類別:申請學位類別: 指指導導教教師師姓姓名名(職職稱稱) : 論文提交日期:論文提交日期: 機房監(jiān)控系統(tǒng)的設計與實現機房監(jiān)控系統(tǒng)的設計與實現 摘摘 要要 為提高機房使用效率,凈化上機環(huán)境,杜絕個別用戶使用機房內電腦做違 規(guī)的事情,為機房管理員提供一個好的機房監(jiān)控系統(tǒng)是必要的。作者在對機房 微機管理過程進行了詳細調查后,參考了一些網吧的微機管理系統(tǒng),獲得了機 房監(jiān)控系統(tǒng)的設計思路。機房管理系統(tǒng)應當能使管理員極其方便的獲取某臺微 機的屏幕視
2、圖,鎖定某臺電腦的鍵盤和鼠標輸入,并能發(fā)送消息給指定的電腦 用戶。 本論文從理論上分析了實現機房監(jiān)控系統(tǒng)所需要的基礎技術的原理,并以 vc+6.0 作為開發(fā)工具,在 win32 平臺下實現了一個機房監(jiān)控系統(tǒng)。論文第二 部分簡述了 tcp/ip 協(xié)議以及 socket 編程技術,第三部分講述了系統(tǒng)的設計目 標和通信協(xié)議,第四章則介紹了實現過程中使用的核心技術,包括屏幕截圖、 鎖定屏幕以及服務器端和客戶端的通信。通過本文的研究,為機房監(jiān)控系統(tǒng)的 設計和實現展示了一個完整的方案,具有一定參考價值。 關鍵詞關鍵詞:機房監(jiān)控系統(tǒng);屏幕截圖;鎖定屏幕;socket the design and imple
3、mentation of the computer room monitor and control system abstract 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 a steady environment. after analyzing the process of the computer
4、 room management and studying some cyber-cafe management system, the concept framework of the computer room monitor and control system was gained. at least, the monitor system must provide abilities to snap the screen of the computer specified by the manager, to disabled the input function of the ke
5、yboard and the mouse and to send messages to the computer users. this article enumerated the technologies needed for the implementation of the monitor 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 art
6、icle, the 2nd chapter introduced the tcp/ip protocol and the socket programming; 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, screen locking and communication bet
7、ween server and client. this article advanced a complete solution for the design and implementation of the computer room monitor system and the solution will be reference for similar applying. key words: computer room monitor system; snap screen; lock screen; socket 目目 錄錄 論文總頁數:31 頁 1.引言.1 1.1 課題背景
8、.1 1.2 內容介紹 .1 2.相關技術原理介紹.2 2.1 tcp/ip 協(xié)議 .2 2.1.1 tcp/ip 協(xié)議簡介 .2 2.1.2 tcp 協(xié)議 .2 2.1.3 ip 協(xié)議 .3 2.1.4 tcp/ip 模型 .3 2.2 socket 技術 .6 2.2.1 socket 基本概念 .6 2.2.2 socket 類型及規(guī)范 .7 2.2.3 win socket api.8 2.3 win32 編程技術 .13 3.系統(tǒng)的設計.14 3.1 系統(tǒng)設計目標 .14 3.2 系統(tǒng)架構設計 .15 4.系統(tǒng)的實現.19 4.1 用戶界面的實現 .19 4.2 核心算法的實現 .2
9、0 4.2.1 客戶端和服務器端的通信 .20 4.2.2 屏幕截圖.23 4.2.3 鎖屏和解屏.26 結 論.28 參考文獻.28 致 謝.30 聲 明.31 1 1 引言引言 1.11.1 課題背景課題背景 當今時代是一個信息種類多元化,信息量巨大化,傳播速度急速化的時代。 要積極面臨這種現狀,就要能快速的處理各種信息,從而引申出人們對信息處 理工具的高度關注。而各種電子設備,尤其是電腦等硬件設備的出現,給人們 的日常生活帶來極大的變化。隨著計算機網絡的出現,更使得人們的信息處理 方式發(fā)生了革命性的改變。毫無疑問,計算機以及由計算機組成的計算機網絡 已經成為當今時代最佳的信息處理工具。掌
10、握這個工具對于科研和學習有著重 要意義。 鑒于這種情況,現在許多學校都提供了微機室,讓在校學生可以很好的學 習計算機操作,并使用計算機輔助學習。對于同學們來說,這本來是個很好的 機會,但有個別同學未能珍惜這個機會,他們沒有好好利用這些微機進行學習 和研究,而是在機房內打游戲或者閑聊等,甚至有人利用電腦進行違反法規(guī)的 活動。這些同學不但浪費了自身的學習機會,同時也浪費了學校的寶貴資源, 而且給周圍的同學造成了很不好的影響。因此,如何對機房進行有效的管理成 為了一個不容忽視的問題。 對于機房管理,一方面應該設立專門的管理員,擬定詳細的機房使用規(guī)則; 另一方面,也應該配備強大的管理軟件,輔助管理員進
11、行管理。因此,如何設 計和實現機房監(jiān)控系統(tǒng)成為了本次課題的研究問題。 1.21.2 內容介紹內容介紹 文章在第二章介紹了一些基本的技術原理,涉及到 tcp/ip 協(xié)議、socket 技術、win32 編程等概念,這些都是實現機房監(jiān)控系統(tǒng)的基礎技術。在第三章, 首先討論了機房監(jiān)控系統(tǒng)應該具備哪些功能,接著設計出了服務器端和客戶端 器的通信協(xié)議。在第四章,首先講述了用戶界面的實現,接著著重介紹了幾個 核心技術的實現,包括如何對某個特定客戶端進行屏幕截圖,如何鎖定指定客 戶端的屏幕以及如何在服務器端和客戶端的進行通信。 2 2 相關技術原理介紹相關技術原理介紹 2.12.1 tcp/iptcp/ip
12、 協(xié)議協(xié)議 .1 tcp/iptcp/ip 協(xié)議簡介協(xié)議簡介 所謂協(xié)議是一套用技術術語描述某些事物應該如何做的規(guī)則。如果執(zhí)行不 同的協(xié)議(一方知道某事的概念,但另一方卻不知道) ,那么他們會因各自的協(xié) 議無法溝通而完不成有用的工作。在計算機網絡領域中,為了完成一項任務, 所涉及的兩個(或多個)通信實體必須運行同樣的協(xié)議。 internet 是 由眾多的計算機網絡交錯連接形成的網際網,作為 internet 成員的各種網絡在通訊中分別執(zhí)行自己的協(xié)議。所謂 internet 協(xié)議是指在 internet 的網絡之間以及各成員網內部交換信息時要求遵循的協(xié)議。在 internet 中,
13、到處運行著協(xié)議,凡是涉及兩個或多個遠程實體的通信活動均由 協(xié)議來支配。協(xié)議定義了兩個或多個通信實體間所交換消息的格式與順序,以 及在發(fā)出和/或收到一個消息或者發(fā)生其他事件所采取的行動。tcp/ip 是 internet 網絡上使用的通用協(xié)議。internet 依靠上千個網絡和百萬計的計算機, 而 tcp/ip 是把它們合在一起的粘結劑。 tcp/ip 的目標是提供高速網絡通信鏈路。tcp/ip 的實際名字來源于兩個最 重要的協(xié)議:tcp 協(xié)議與 ip 協(xié)議,其中傳輸控制協(xié)議 tcp 對應于開放系統(tǒng)互聯 0si 參考模型的傳輸層協(xié)議;網絡連接協(xié)議 ip 則對應于 osi 參考模型的網絡層 協(xié)議。
14、所以 tcp/ip 分別是 internet 在傳輸層和網絡層執(zhí)行的協(xié)議。 .2 tcptcp 協(xié)議協(xié)議 tcp 協(xié)議是互聯網傳輸層協(xié)議。tcp 服務模型包括面向連接的服務和可靠的 數據傳輸服務,調用 tcp 作為其傳輸協(xié)議的應用同時取得這兩種服務??傮w來 說,tcp 保證遞送全部數據,但對遞送速率和所經歷的延遲不加保證。電子郵 件、遠程終端訪問、web 和文件傳送都使用 tcp。這些應用選擇 tcp 的主要原因 在于 tcp 提供可靠的數據傳輸服務,能夠保證所有數據最終到達其目的地。 tcp 的傳輸實體一般為軟件實現:一部分是用戶進程,一部分是操作系統(tǒng)的 部分核心(管理 tc
15、p 字節(jié)流,實現與 ip 層的接口) 。tcp 的傳輸服務是通過在 收發(fā)雙方創(chuàng)建套接字 socket 來實現的;socket 的地址是通過 ip 地址與端口號 來標識的。每條 tcp 的傳輸連接用發(fā)送端套接字、接收端套接字來表示,是點 到點的全雙工通道(全雙工支持同時的雙向傳輸)運行與 tcp 上的應用程 序包括 ftp、http、smtp 和 telnet。 在 internet 內部,從主機傳送到主機的信息不是一個恒定的流,而是把數 據分解成小包,即數據包。例如你要發(fā)一分很長的電子郵件(e-mail)給一位朋 友,tcp 就將該信息分成很多個數據包,每一個數據包用一序號和接收地址來 標記。
16、此外 tcp 還插入一些糾錯信息。接著數據包被傳過網絡,即把它們傳送 給遠程的主機這就是 ip 的工作。在另一端 tcp 接收數據并檢查錯誤。如果有錯 誤發(fā)生,tcp 就可以要求重發(fā)信息。換句話說,ip 的工作是把原始數據(數據包)從 一端傳送到另一端;tcp 的工作就是管理這種流動并確保其數據是正確的。把數 據分解成數據包有很多的好處。首先,它允許 internet 讓很多不同的用戶在同 一時間用同一通訊線路。因為這些數據包不必一起輸送,所以通訊線路可以載 著所有類型的數據包按它們自己的路徑從一地到另一地。就如同一條高速公路 上,各類汽車(即使它們開向不同的地方)都在公共道路上行駛。當數據包
17、傳 輸時,它們沿規(guī)定的路由從主機到主機,一直到它們到達最終目的地。這意味 著 internet 很具靈活性。如果一個特定的連接中斷了,控制數據流動的計算機 通??梢哉业搅硪粭l路由。事實上,在單一數據傳輸中,多個數據包完全可能 沿不同的路由傳輸。當條件改變時,網絡可獲得當時最好的連接。如當網絡的 某一部分過載,數據包可以改變路線去走那些比較空閑的線路。用數據包傳輸 的另一個好處是,當某處出錯,只須重新傳送單個數據包,而不是整個信息。 這樣會大大加快 internet 的傳輸總速度。這種靈活性產生很高的可靠性。 internet 運行非常好,雖然所有數據包都必須通過很多計算機,但它可以用幾 秒鐘就
18、把一個文件從一主機傳輸到另一主機,盡管它們相距很遠。 .3 ipip 協(xié)議協(xié)議 網際網絡協(xié)議(ip)用于數據報交換網絡互連系統(tǒng)種,是 tcp/ip 協(xié)議堆棧所 采用的傳輸協(xié)議。ip 協(xié)議的基本數據形態(tài)是數據元(datagram) ,一般都成為 數據報,此協(xié)議提供了從來源主機到目的主機之間數據報的傳輸機制。ip 數據 報中攜帶這來源地址和目的地址,利用這些地址數據,可將數據報傳輸到目的 主機。ip 協(xié)議具有數據報分割以及重組機制,需要的時候可以將數據報作適當 的分割以及重組,以便能夠在網絡中傳輸。 ip 協(xié)議是網絡層協(xié)議,它是一種不可靠的,無連接導向的協(xié)議,無論是端 對端或者路由
19、器對路由器,都不提供可靠的傳輸,也不會提供確認信息,除了 報頭校驗和外,ip 協(xié)議本身沒有數據的錯誤控制機制,一旦數據發(fā)生錯誤或者 未能完整的接收,都不能重傳。甚至即使是只有一個字節(jié)發(fā)生錯誤或者沒有收 到,也必須將整個數據報都丟棄。雖然,ip 協(xié)議提供了數據報的傳輸機制,但 是并沒有提供傳輸的可靠性、流量控制、順序性服務機制,它所提供的只是最 佳化的傳輸服務。 .4 tcp/iptcp/ip 模型模型 習慣上,人們把 internet 的通訊協(xié)議籠統(tǒng)地稱為 tcp/ip 協(xié)議,也有人把 internet 稱為 tcp/ip 網或 tcp/ip internet 網。在這種意義下
20、,internet 的 tcp/ip 協(xié)議可以說就是基于四種模型的協(xié)議:即應用層、傳輸層、網絡層和網 絡訪問層。其中網絡訪問層又分為網絡接口層(鏈路層)和最基礎的物理層。所 以也可以說 internet 的網絡協(xié)議是基于五層模型的協(xié)議。 根據 tcp/ip 協(xié)議,互聯網分為 4 層,加上最底層的硬件層一共是 5 層 應用層(第五層) 傳輸層(第四層) 網絡層(第三層) 鏈路層(第二層) 物理層(第一層) 圖 2-1 tcp/ip 協(xié)議分層 1)物理層: 物理層的任務是把幀中的各位從一個節(jié)點移往下一個節(jié)點。這一層的協(xié)議 也取決于鏈路,而進一步取決于鏈路真正的傳輸介質。 物理層提供了一個基本機制:
21、對二進制數據(比特)進行編碼(發(fā)送到物 理介質)和解碼(從物理介質接收) ,例如 10mbit/s(bit/s 指比特每秒)以太 網的曼徹斯特編碼、光纖分布式數據接口(fiber distributed data interface,簡稱 fddi)的 4b/5b 編碼;物理層也負責通知第二層(鏈路層) 何時訪問介質。物理層以比特流的方式傳送來自鏈路層的數據,而不理會數據 的含義或格式;同樣,它接收數據以后,不加分析直接傳給鏈路層。 物理層也定義與介質的物理連接機制,但不是介質本身,按照參考模型的 原理,實際的物理介質在物理層之下。 2)鏈路層: 鏈路層的任務是把完整的幀從一個網絡組建移往某個
22、緊鄰的組件,負責管 理數據格式。它定義了將數據組成正確幀的規(guī)程和在網絡中傳輸幀的規(guī)程,幀 是指一串數據,它是數據在網絡中傳輸的單位。網絡層在源端和目的端之間經 由一系列分組交換機(路由器)路由分組。為了將一個分組從一個節(jié)點(主機 或分組交換機)移往其路徑上的下一個節(jié)點,網絡層必須依賴由鏈路層提供的 服務。鏈路層提供了對鏈路的管理,鏈路層提供的服務取決于應用在鏈路上的 特定鏈路層協(xié)議。分組從源端到目的端一般需要經過多個鏈路,每個分組沿其 路徑到達不同鏈路是,可能有不同的鏈路層協(xié)議來處理。既是說,ip 從不同的 鏈路層協(xié)議獲取的服務會不一樣。 鏈路層負責監(jiān)督相鄰網絡節(jié)點的信息流動,它使用檢錯或糾錯
23、技術來確保 正確的傳輸:當鏈路檢測到錯誤時,它請求重發(fā),或是根據情況糾正。此外, 鏈路層還要解決流量控制的問題。 3)網絡層: 網絡層提供越過多個網絡的選路功能,為端點提供無連接的數據報訪問, 并定義端到端通過整個互聯網網絡的尋址功能。網絡層負責尋址、打包以及從 一臺計算機通過一個或多個路由器到最終目標的包轉發(fā)機制。網絡層的核心協(xié) 議有:ip、arp/rarp、icmp 和 igmp。ip 協(xié)議(internet protocol,簡稱 ip) 是 tcp/ip 模型的核心,它是一個路由協(xié)議,負責 ip 尋址、路由選擇、分段及 包重組。 4)傳輸層: 傳輸層給應用提供在其客戶端和服務器之間傳輸
24、應用層消息的服務。即傳 輸層負責為兩個用戶進程之間建立、管理和拆除可靠而又有效的端到端連接。 傳輸層的核心協(xié)議是傳輸控制協(xié)議 tcp(transmission control protocol)和 用戶數據報協(xié)議 udp(user datagram protocol) 。tcp 給其應用提供面向連接 的服務,該服務包括應用層消息往目的地有保證的遞送以及流量控制(既發(fā)送 端和接收端之間速度的匹配) 。tcp 還把長數據塊分割成較小的段,并提供擁塞 控制機制。這樣當網絡處于擁塞狀態(tài)時,源端會抑制其發(fā)送速率。udp 協(xié)議給 其應用提供無連接的服務,是一個幾乎沒有任何修飾的服務。 5)應用層: 應用層
25、負責支持網絡應用,直接與用戶或應用程序通信,它給應用程序提 供訪問其他層服務的能力并定義應用程序用于交換數據的協(xié)議。應用層包括許 多協(xié)議,例如支持 web 的 http、支持文件傳送的 ftp、支持電子郵件的 smtp 協(xié)議都建立在這一層。 tcp/ip 應用程序使用的應用層接口有 windows 套接字(winsock) 、 netbios 等。windows 套接字提供 windows 下的標準應用編程接口;netbios 是 工業(yè)標準接口,用于訪問協(xié)議服務,如會話、數據報和名字解析等。 internet 的核心層是網絡層和傳輸層,相應的核心協(xié)議是 ip 協(xié)議和 tcp 協(xié)議。ip 協(xié)議的
26、主要功能包括無連結數據報傳送數據報尋徑以及差錯處理三 部分。ip 協(xié)議的特點是點到點的,ip 對等實體間的通信不經過中間機器,對等 實體所在的機器位于同一物理網絡,對等機器之間有直接的物理連接。ip 層的 主要功能是屏蔽下面物理層的差別,向上一層提供一致的數據格式。所有要傳 輸的數據,被按照一定的格式分組封裝層 ip 數據報,數據報單元通過尋徑等機 制進行傳輸,在接收方數據報進行重組,得到最初要傳送的數據。由于 ip 協(xié)議 是不可靠的數據傳輸協(xié)議,由于網絡的擁塞而發(fā)生的數據丟失等情況是不可避 免的,因此 internet 還必須有一定的控制重傳機制,這就是差錯與控制報文 協(xié)議(icmp)。 盡
27、管計算機通過安裝 ip 軟件,從而保證了計算機之間可以發(fā)送和接收數據, 但 ip 協(xié)議還不能解決數據分組在傳輸過程中可能出現的問題。因此,若要解決 可能出現的問題,還需要 tcp 協(xié)議來提供可靠的并且無差錯的通信服務。tcp 協(xié)議被稱作一種端對端協(xié)議。這是因為它為兩臺計算機之間的連接起了重要作 用:當一臺計算機需要與另一臺遠程計算機連接時,tcp 協(xié)議會讓它們建立一 個連接、發(fā)送和接收數據以及終止連接。傳輸控制協(xié)議 tcp 協(xié)議利用重發(fā)技術 和擁塞控制機制,向應用程序提供可靠的通信連接,使它能夠自動適應網上的 各種變化。即使在 internet 暫時出現堵塞的情況下,tcp 也能夠保證通信的
28、可靠。互聯網是一個龐大的國際性網絡,網路上的擁擠和空閑時間總是交替不 定的,加上傳送的距離也遠近不同,所以傳輸數據所用時間也會變化不定。tcp 協(xié)議具有自動調整超時值的功能,能很好地適應 internet 上各種各樣的變 化,確保傳輸數值的正確。 ip 協(xié)議只保證計算機能發(fā)送和接收分組數據,而 tcp 協(xié)議則可提供一個可 靠的、可流控的、全雙工的信息流傳輸服務。雖然 ip 和 tcp 這兩個協(xié)議的功能 不盡相同,也可以分開單獨使用,但它們是在同一時期作為一個協(xié)議來設計的, 并且在功能上也是互補的。只有兩者的結合,才能保證 internet 在復雜的環(huán) 境下正常運行。凡是要連接到 interne
29、t 的計算機,都必須同時安裝和使用這 兩個協(xié)議,因此在實際中常把這兩個協(xié)議統(tǒng)稱作 tcp/ip 協(xié)議。 2.22.2 socket 技術技術 .1 socketsocket 基本概念基本概念 20 世紀 80 年代初,美國政府的高級研究機構(arpa)給加利福尼亞大學 berkeley 分校提供資金,讓他們在 unix 操作系統(tǒng)下實現 tcp/ip 協(xié)議。在這個 項目中,研究人員為 tcp/ip 網絡通信開發(fā)了 api(應用程序接口) 。這個 api 稱為 socket 接口。如今 socket 接口是 tcp/ip 網絡最為通用的 api,也是在 internet 上進行應用
30、開發(fā)最為通用的 api。 internet 是有不同種類的網絡互連而成,實現不同網絡及計算機之間交互 操作的關鍵問題是由 tcp/ip 協(xié)議來解決的。tcp/ip 協(xié)議的核心是傳輸層協(xié)議 (tcp 和 udp) 、網絡層協(xié)議(ip)和網絡接口層,前兩層在操作系統(tǒng)內核中實 現。操作系統(tǒng)內核是不能直接為一般用戶所感受到的,一般用戶感受到的只有 應用程序(包括系統(tǒng)應用程序) ,即各種應用程序構成了操作系統(tǒng)的用戶視圖。 兩者之間的接口是網絡編程界面(程序員界面) 。因此,tcp/ip 網絡環(huán)境下的 應用程序也不是直接與 tcp/ip 核心打交道,而是與網絡應用編程接口(套接字, socket)打交道,
31、編程接口構成了核心協(xié)議的用戶視圖。 實際上,socket 在計算機中提供了一個通信端口,可以通過這個端口與任 何一個具有 socket 接口的計算機通信。應用程序在網絡上傳輸,接收的信息都 通過這個 socket 接口來實現。在應用開發(fā)中,就像使用文件句柄一樣,可以對 socket 句柄進行讀、寫操作??梢园?socket 看成是一根連接線,當在兩臺計 算機之間建立了一個 socket 之后,兩臺計算機就可以通過這根連接線來完成信 息交互,所做的僅僅是向這根連接線里寫入數據,再從其中讀出數據,而不必 擔心會不會由信息丟失,socket 會負責照看好數據。 socket 用于表達兩臺機器之間的連
32、接終端 。一個網絡應用涉及兩臺 (或兩臺以上)不同主機中跨網絡彼此通信的兩個進程。這兩個進程通過經由 各自的套接字(socket)發(fā)送和接收消息彼此通信。對于一個給定的連接,每 臺機器上都有一個套接字。有點像我們打電話,用電纜把電話連接起來,中間 的物理結構和具體實現過程我們不必了解,只要我們能進行通話即可。套接字 是單臺主機內應用層和傳輸層之間的接口。套接字也用于指代應用程序和網絡 之間的應用程序接口(application program interface,簡稱 api) ,因為它 又是用于構造互聯網中的網絡應用程序的編程接口。當我們進行編程時,需要 用到 socket 接口,socke
33、t 接口定義了許多函數或例程,我們可以直接調用它 們實現網絡連接、通信等功能。socket 接口為我們建立通信信道,我們可以通 過這條通道來與一臺或多臺計算機進行連接。 套接字屏蔽了底層通信軟件和具體操作系統(tǒng)的差異,使得任何兩臺安裝了 tcp 協(xié)議軟件和實現了套接字規(guī)范的計算機之間的通信成為可能。對于應用程 序來說,它就像一個服務協(xié)議插座一樣,各種不同的協(xié)議,對應不同的端口。 我們可以把套接字看作相應進程上的“門”:進程把消息發(fā)送到網絡或從 網絡接收消息都得經過自身得套接字。當一個進程想給另一臺主機中的另一個 進程發(fā)送消息是,它就把該消息推出自家的門。該進程認定在這扇門的另一側 有一個傳輸設施
34、會把這個消息傳輸到目的進程的門口。在服務器進程處于運行 狀態(tài)的情況下,客戶進程就能夠初始化一個到服務器的 tcp 連接了,這是通過 在客戶程序中創(chuàng)建一個套接字對象來完成的,當客戶創(chuàng)建了它的套接字對象的 時候,它詳細說明了服務器進程的地址,也就是,服務器的 ip 地址和進程的端 口號,一旦創(chuàng)建了套接字對象,客戶端的 tcp 就發(fā)起一個三次握手,并建立一 個和服務器的 tcp 連接,三次握手對客戶和服務器程序來說是完全透明的。 .2 socketsocket 類型及規(guī)范類型及規(guī)范 可以提供給用戶使用的套接字有兩種,它們分別是數據報套接字和流式套 接字: 1)流式套接字(socket
35、_stream) 提供了面向連接、雙向可靠的數據流傳輸服務,數據無出錯,無重復地發(fā) 送且按發(fā)送順序接收。內設流量控制,避免數據流超限;數據被看作是字節(jié)流, 無長度限制。 流式套接字使用傳輸控制協(xié)議(tcp) 。它提供了一種可靠的,面向連接的 數據傳輸方式。通常基于連接的流式套接字是設計客戶機/服務器應用程序時的 標準。流式套接字主要用于大批量數據或者讓數據按順序無重復的到達目的地 而使用 2)數據報式套接字(socket_dgram) 提供了無連接服務。數據包以獨立形式被發(fā)送,不提供無錯保證,數據可 能丟失或者重復,并且接收順序無序。數據報套接字使用用戶數據報協(xié)議 (udp) 。實際使用中,同
36、一個分組數據報可能不止一次的被發(fā)送,一般要等到 接收方發(fā)回確認收到的消息才會停止發(fā)送。 一般有兩種套接字規(guī)范:一種是針對 unix 系統(tǒng)的 berkely socket 規(guī)范; 一種是占主流地位的 windows sockets(簡稱 winsock)規(guī)范,它是 microsoft 以 berkely socket 規(guī)范為范例開發(fā)的 windows 下的網絡編程接口。 windows socket 規(guī)范定義并記錄了如何使用 api 與 internet 協(xié)議相連接, 且所有的 windows socket 實現都支持流式套接字和數據報套接字。應用程序調 用 windows socket 的 a
37、pi 實現相互之間的通信。windows socket 又利用下層 的網絡通信協(xié)議功能和操作系統(tǒng)調用實現實際的通信工作。 .3 winwin socketsocket apiapi 本文在軟件實現上使用的 socket 函數正是 windows socket api。下面介 紹幾個重要的 api: 一) wsastartup 函數 int wsastartup( word wversionrequested, lpwsadata lpwsadata ); 使用 socket 的程序在使用 socket 之前必須調用 wsastartup 函數。該 函數的第一個參數指明程序請求使
38、用的 socket 版本,其中高位字節(jié)指明副 版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二個參數返回請求的 socket 的版本信息。當一個應用程序調用 wsastartup 函數時,操作系統(tǒng)根據請求 的 socket 版本來搜索相應的 socket 庫,然后綁定找到的 socket 庫到該應 用程序中。以后應用程序就可以調用所請求的 socket 庫中的其它 socket 函 數了。該函數執(zhí)行成功后返回 0。 例:假如一個程序要使用 2.1 版本的 socket,那么程序代碼如下 wversionrequested = makeword( 2, 1 ); err = wsastartup( w
39、versionrequested, 二) wsacleanup 函數 int wsacleanup (void); 應用程序在完成對請求的 socket 庫的使用后,要調用 wsacleanup 函數 來解除與 socket 庫的綁定并且釋放 socket 庫所占用的系統(tǒng)資源。 三) socket 函數 socket socket( int af, int type, int protocol ); 應用程序調用 socket 函數來創(chuàng)建一個能夠進行網絡通信的套接字。第 一個參數指定應用程序使用的通信協(xié)議的協(xié)議族,對于 tcp/ip 協(xié)議族,該 參數置 pf_inet;第二個參數指定要創(chuàng)建的套
40、接字類型,流套接字類型為 sock_stream、數據報套接字類型為 sock_dgram;第三個參數指定應用程序 所使用的通信協(xié)議。該函數如果調用成功就返回新創(chuàng)建的套接字的描述符, 如果失敗就返回 invalid_socket。套接字描述符是一個整數類型的值。每 個進程的進程空間里都有一個套接字描述符表,該表中存放著套接字描述符 和套接字數據結構的對應關系。該表中有一個字段存放新創(chuàng)建的套接字的描 述符,另一個字段存放套接字數據結構的地址,因此根據套接字描述符就可 以找到其對應的套接字數據結構。每個進程在自己的進程空間里都有一個套 接字描述符表但是套接字數據結構都是在操作系統(tǒng)的內核緩沖里。下面
41、是一 個創(chuàng)建流套接字的例子: struct protoent *ppe; ppe=getprotobyname(tcp); socket listensocket=socket(pf_inet,sock_stream,ppe-p_proto); 四) closesocket 函數 int closesocket( socket s ); closesocket 函數用來關閉一個描述符為 s 套接字。由于每個進程中都 有一個套接字描述符表,表中的每個套接字描述符都對應了一個位于操作系 統(tǒng)緩沖區(qū)中的套接字數據結構,因此有可能有幾個套接字描述符指向同一個 套接字數據結構。套接字數據結構中專門有一個字
42、段存放該結構的被引用次 數,即有多少個套接字描述符指向該結構。當調用 closesocket 函數時,操 作系統(tǒng)先檢查套接字數據結構中的該字段的值,如果為 1,就表明只有一個 套接字描述符指向它,因此操作系統(tǒng)就先把 s 在套接字描述符表中對應的那 條表項清除,并且釋放 s 對應的套接字數據結構;如果該字段大于 1,那么 操作系統(tǒng)僅僅清除 s 在套接字描述符表中的對應表項,并且把 s 對應的套接 字數據結構的引用次數減 1。 closesocket 函數如果執(zhí)行成功就返回 0,否則返回 socket_error。 五) send 函數 int send( socket s, const char
43、 far *buf, int len, int flags ); 不論是客戶還是服務器應用程序都用 send 函數來向 tcp 連接的另一端 發(fā)送數據??蛻舫绦蛞话阌?send 函數向服務器發(fā)送請求,而服務器則通常 用 send 函數來向客戶程序發(fā)送應答。該函數的第一個參數指定發(fā)送端套接 字描述符;第二個參數指明一個存放應用程序要發(fā)送數據的緩沖區(qū);第三個 參數指明實際要發(fā)送的數據的字節(jié)數;第四個參數一般置 0。這里只描述同 步 socket 的 send 函數的執(zhí)行流程。當調用該函數時,send 先比較待發(fā)送 數據的長度 len 和套接字 s 的發(fā)送緩沖區(qū)的長度,如果 len 大于 s 的發(fā)送
44、緩 沖區(qū)的長度,該函數返回 socket_error;如果 len 小于或者等于 s 的發(fā)送 緩沖區(qū)的長度,那么 send 先檢查協(xié)議是否正在發(fā)送 s 的發(fā)送緩沖中的數據, 如果是就等待協(xié)議把數據發(fā)送完,如果協(xié)議還沒有開始發(fā)送 s 的發(fā)送緩沖中 的數據或者 s 的發(fā)送緩沖中沒有數據,那么 send 就比較 s 的發(fā)送緩沖區(qū)的 剩余空間和 len,如果 len 大于剩余空間大小 send 就一直等待協(xié)議把 s 的 發(fā)送緩沖中的數據發(fā)送完,如果 len 小于剩余空間大小 send 就僅僅把 buf 中的數據 copy 到剩余空間里(注意并不是 send 把 s 的發(fā)送緩沖中的數據傳 到連接的另一端
45、的,而是協(xié)議傳的,send 僅僅是把 buf 中的數據 copy 到 s 的發(fā)送緩沖區(qū)的剩余空間里) 。如果 send 函數 copy 數據成功,就返回實際 copy 的字節(jié)數,如果 send 在 copy 數據時出現錯誤,那么 send 就返回 socket_error;如果 send 在等待協(xié)議傳送數據時網絡斷開的話,那么 send 函數也返回 socket_error。要注意 send 函數把 buf 中的數據成功 copy 到 s 的發(fā)送緩沖的剩余空間里后它就返回了,但是此時這些數據并不一定馬上 被傳到連接的另一端。如果協(xié)議在后續(xù)的傳送過程中出現網絡錯誤的話,那 么下一個 socket
46、 函數就會返回 socket_error。 (每一個除 send 外的 socket 函數在執(zhí)行的最開始總要先等待套接字的發(fā)送緩沖中的數據被協(xié)議傳送完畢 才能繼續(xù),如果在等待時出現網絡錯誤,那么該 socket 函數就返回 socket_error) 注意:在 unix 系統(tǒng)下,如果 send 在等待協(xié)議傳送數據時網絡斷開的話, 調用 send 的進程會接收到一個 sigpipe 信號,進程對該信號的默認處理是 進程終止。 六) recv 函數 int recv( socket s, char far *buf, int len, int flags ); 不論是客戶還是服務器應用程序都用 r
47、ecv 函數從 tcp 連接的另一端接 收數據。該函數的第一個參數指定接收端套接字描述符;第二個參數指明一 個緩沖區(qū),該緩沖區(qū)用來存放 recv 函數接收到的數據;第三個參數指明 buf 的長度;第四個參數一般置 0。這里只描述同步 socket 的 recv 函數的 執(zhí)行流程。當應用程序調用 recv 函數時,recv 先等待 s 的發(fā)送緩沖中的數 據被協(xié)議傳送完畢,如果協(xié)議在傳送 s 的發(fā)送緩沖中的數據時出現網絡錯誤, 那么 recv 函數返回 socket_error,如果 s 的發(fā)送緩沖中沒有數據或者數據 被協(xié)議成功發(fā)送完畢后,recv 先檢查套接字 s 的接收緩沖區(qū),如果 s 接收
48、緩沖區(qū)中沒有數據或者協(xié)議正在接收數據,那么 recv 就一直等待,只到協(xié) 議把數據接收完畢。當協(xié)議把數據接收完畢,recv 函數就把 s 的接收緩沖 中的數據 copy 到 buf 中(注意協(xié)議接收到的數據可能大于 buf 的長度,所 以在這種情況下要調用幾次 recv 函數才能把 s 的接收緩沖中的數據 copy 完。 recv 函數僅僅是 copy 數據,真正的接收數據是協(xié)議來完成的) ,recv 函數 返回其實際 copy 的字節(jié)數。如果 recv 在 copy 時出錯,那么它返回 socket_error;如果 recv 函數在等待協(xié)議接收數據時網絡中斷了,那么它 返回 0。 注意:在
49、 unix 系統(tǒng)下,如果 recv 函數在等待協(xié)議接收數據時網絡斷開 了,那么調用 recv 的進程會接收到一個 sigpipe 信號,進程對該信號的默 認處理是進程終止。 七) bind 函數 int bind( socket s, const struct sockaddr far *name, int namelen ); 當創(chuàng)建了一個 socket 以后,套接字數據結構中有一個默認的 ip 地址和 默認的端口號。一個服務程序必須調用 bind 函數來給其綁定一個 ip 地址和 一個特定的端口號。客戶程序一般不必調用 bind 函數來為其 socket 綁定 ip 地址和斷口號。該函數的
50、第一個參數指定待綁定的 socket 描述符;第二 個參數指定一個 sockaddr 結構,該結構是這樣定義的: struct sockaddr u_short sa_family; char sa_data14; ; sa_family 指定地址族,對于 tcp/ip 協(xié)議族的套接字,給其置 af_inet。當對 tcp/ip 協(xié)議族的套接字進行綁定時,我們通常使用另一 個地址結構: struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8; ; 其中 sin_
51、family 置 af_inet;sin_port 指明端口號;sin_addr 結構體 中只有一個唯一的字段 s_addr,表示 ip 地址,該字段是一個整數,一般用 函數 inet_addr()把字符串形式的 ip 地址轉換成 unsigned long 型的整 數值后再置給 s_addr。有的服務器是多宿主機,至少有兩個網卡,那么運 行在這樣的服務器上的服務程序在為其 socket 綁定 ip 地址時可以把 htonl(inaddr_any)置給 s_addr,這樣做的好處是不論哪個網段上的客戶程 序都能與該服務程序通信;如果只給運行在多宿主機上的服務程序的 socket 綁定一個固定的
52、 ip 地址,那么就只有與該 ip 地址處于同一個網段 上的客戶程序才能與該服務程序通信。我們用 0 來填充 sin_zero 數組,目 的是讓 sockaddr_in 結構的大小與 sockaddr 結構的大小一致。下面是一個 bind 函數調用的例子: struct sockaddr_in saddr; saddr.sin_family = af_inet; saddr.sin_port = htons(8888); saddr.sin_addr.s_addr = htonl(inaddr_any); bind(listensocket,(struct sockaddr *) 服務程序可以
53、調用 listen 函數使其流套接字 s 處于監(jiān)聽狀態(tài)。處于監(jiān) 聽狀態(tài)的流套接字 s 將維護一個客戶連接請求隊列,該隊列最多容納 backlog 個客戶連接請求。假如該函數執(zhí)行成功,則返回 0;如果執(zhí)行失敗, 則返回 socket_error。 九) accept 函數 socket accept( socket s, struct sockaddr far *addr, int far *addrlen ); 服務程序調用 accept 函數從處于監(jiān)聽狀態(tài)的流套接字 s 的客戶連接請 求隊列中取出排在最前的一個客戶請求,并且創(chuàng)建一個新的套接字來與客戶 套接字創(chuàng)建連接通道,如果連接成功,就返回
54、新創(chuàng)建的套接字的描述符,以 后與客戶套接字交換數據的是新創(chuàng)建的套接字;如果失敗就返回 invalid_socket。該函數的第一個參數指定處于監(jiān)聽狀態(tài)的流套接字;操作 系統(tǒng)利用第二個參數來返回新創(chuàng)建的套接字的地址結構;操作系統(tǒng)利用第三 個參數來返回新創(chuàng)建的套接字的地址結構的長度。下面是一個調用 accept 的例子: struct sockaddr_in serversocketaddr; int addrlen; addrlen=sizeof(serversocketaddr); serversocket=accept(listensocket,(struct sockaddr *) 十)
55、connect 函數 int connect( socket s, const struct sockaddr far *name, int namelen ); 客戶程序調用 connect 函數來使客戶 socket s 與監(jiān)聽于 name 所指定的 計算機的特定端口上的服務 socket 進行連接。如果連接成功,connect 返 回 0;如果失敗則返回 socket_error。下面是一個例子: struct sockaddr_in daddr; memset(void *) daddr.sin_family=af_inet; daddr.sin_port=htons(8888); d
56、addr.sin_addr.s_addr=inet_addr(); connect(clientsocket,(struct sockaddr *) 2.32.3 win32win32 編程技術編程技術 win32 是指 window 都是 32 位的操作系統(tǒng),例如 98、xp、2000、2003 等操 作系統(tǒng), win32 編程就是在這些系統(tǒng)下的編程,運用 window 提供的 api(application programming interface)為 window 編寫應用程序。 win32 編程可以用 c 來完成,主要是通過 windows 的 api 來工作
57、。然而更方便的是使 用 mfc,微軟基礎類(microsoft foundation classes),實際上是微軟提供的,用 于在 c+環(huán)境下編寫應用程序的一個框架和引擎,vc+是 windows 下開發(fā)人員使 用的專業(yè) c+ sdk(sdk, standard software develop kit,專業(yè)軟件開發(fā)平臺), mfc 就是掛在它之上的一個輔助軟件開發(fā)包,mfc 作為與 vc+血肉相連的部分, 可以大大方便程序員,簡化程序員的工作。 mfc 是 win api 與 c+的結合,api,即微軟提供的 windows 下應用程序的編 程語言接口,是一種軟件編程的規(guī)范,但不是一種程序
58、開發(fā)語言本身,可以允許用 戶使用各種各樣的第三方的編程語言來進行對 windows 下應用程序的開發(fā),使這 些被開發(fā)出來的應用程序能在 windows 下運行,比如 vb, vc+, java, delphi 編程語言函數本質上全部源于 api,因此用它們開發(fā)出來的應用程序都能工作在 windows 的消息機制和繪圖里,遵守 windows 作為一個操作系統(tǒng)的內部實現。上 面說到 mfc 是微軟對 api 函數的專用 c+封裝,這種結合一方面讓用戶使用微軟 的專業(yè) c+ sdk 來進行 windows 下應用程序的開發(fā)變得容易,因為 mfc 是對 api 的封裝,微軟做了大量的工作,隱藏了好多
59、內節(jié)程序開發(fā)人員在 windows 下用 c+ bool unlockscreen(char* ip); bool lockscreen(char* ip); bool sendmsg(char* ip, char* msg); cstring getnextclientip(); void preenum(); bool snapscreen(char *ip, cximage void aliveall(); void addclient(const client void run(); cserver() initializecriticalsection( ; cserver() de
60、letecriticalsection( closesocket(srvsock); wsacleanup(); ; bool init(int port); private: static dword winapi listenthreadprc(lpvoid lpparam); socket srvsock; sockaddr_in srvaddr; vector clients; critical_section cs; int pos; ; class cclient private: socket local; sockaddr_in remote_addr; int remote_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- SARS-CoV-2-IN-93-生命科學試劑-MCE
- S-Alaproclate-hydrochloride-S-GEA-654-hydrochloride-生命科學試劑-MCE
- 狂犬病的預防措施
- 2023年陜西煤業(yè)新型能源科技股份有限公司招聘考試真題
- 2023年內蒙古日報社招聘工作人員筆試真題
- 2023年梅州市市直機關遴選公務員考試真題
- 2024年電器附件真空斷路器項目申請報告范文
- 2023年河池市東蘭縣參加師范類畢業(yè)生就業(yè)筆試真題
- 病毒與人類研究報告
- 病房封閉管理實施方案
- 自然拼讀法-圖文.課件
- 創(chuàng)新創(chuàng)業(yè)實訓智慧樹知到期末考試答案章節(jié)答案2024年西安理工大學
- 2024屆宜賓市九年級語文上學期期中考試卷附答案解析
- 大學生國家安全教育智慧樹知到期末考試答案2024年
- 2024繼續(xù)教育《醫(yī)學科研誠信與醫(yī)學了研究倫理》答案
- 硫磺安全技術說明書MSDS
- 國開電大《工程數學(本)》形成性考核作業(yè)5答案
- GB/T 28653-2012工業(yè)氟化銨
- GB/T 13914-2013沖壓件尺寸公差
- 價值觀考核評定表
- 球罐施工技術方案(完整版)
評論
0/150
提交評論