版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 摘 要</b></p><p> 隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)速度的加快,遠(yuǎn)程控制技術(shù)支持將逐漸占據(jù)技術(shù)支持的主流。本文講述的是一個(gè)基于Windows而開發(fā)的遠(yuǎn)程控制程序,用到了WinSock的API技術(shù)。對遠(yuǎn)程控制涉及的技術(shù)和方法等進(jìn)行了函數(shù)原型級的詳細(xì)解釋,可以很容易的理解。</p><p> 本文首先介紹了實(shí)現(xiàn)遠(yuǎn)程控制基礎(chǔ)Sock
2、et編程的基本概念,以及Windows的消息系統(tǒng),接著從建立Socket套接字開始,經(jīng)過逐個(gè)功能模塊的分析實(shí)現(xiàn),包括從自動(dòng)運(yùn)行,到關(guān)機(jī),到直接控屏功能等,然后重點(diǎn)介紹了各功能模塊的具體實(shí)現(xiàn)過程,特別是文件管理和直接控屏的實(shí)現(xiàn)。最后介紹了設(shè)計(jì)體會和編程體會。</p><p> 本文在文件管理方面采用了FTP技術(shù)支持,利用在被控端建立一個(gè)FTP客戶端,在本地運(yùn)行一個(gè)FTP服務(wù)器,通過利用FTP技術(shù)來實(shí)現(xiàn)對目錄查詢,
3、文件傳輸?shù)任募僮鳌J刮募芾砟軌蚝唵螌?shí)現(xiàn)!在直接控屏模塊的實(shí)現(xiàn)過程中,客戶端主要是負(fù)責(zé)向服務(wù)器端發(fā)出獲取服務(wù)端屏幕圖像數(shù)據(jù)的請求,把從服務(wù)器端發(fā)送來的屏幕圖像在本地實(shí)時(shí)地顯示出來,并且及時(shí)發(fā)送鼠標(biāo)在本地顯示圖像的動(dòng)作響應(yīng)給服務(wù)器;而服務(wù)器端主要是負(fù)責(zé)響應(yīng)客戶端的請求并抓取與發(fā)送屏幕圖像,響應(yīng)客戶端發(fā)送過來的鼠標(biāo)、鍵盤等的動(dòng)作并反饋給客戶端。從而實(shí)現(xiàn)了對遠(yuǎn)程計(jì)算機(jī)的直接控制屏幕的操作。</p><p> 關(guān)鍵詞
4、:C/S模式;Socket;FTP;直接控屏。</p><p><b> Abstract</b></p><p> With the development of network technology and speeding, the Remote technical support gradually will occupy the main technic
5、al support. This article is based on the Windows OS in the remote control procedure, and uses the WinSock API technology. The technology and the methods used in the remote control have carried on the function prototype l
6、evel detailed explaination , it will be very easily understood. </p><p> First, This article introduces the remote control foundation and the basic concept of Socket programming, Following, from the Socket
7、 established to the process function module, it analyzes one by one, which includes the auto-boot, directly-controlling-screen, shutdown and so on . The third, it emphasized introduced various functions module, especiall
8、y the realization of the File management and the direct-screen -control. Finally, it introduces the design realized and the experience of the progr</p><p> What’s more, this article adopts the FTP technical
9、 in the File management model. It establishes a FTP client in the Server side, and runs a FTP server in the Client side. Then, with the transferring of the file operation, it solves the basis file management problem. Thi
10、s causes the file management easily being realized! In the directly-controlling-screen module, the client side’s main mission is to send the request of capturing server’s screen image data to the server and show the scre
11、en image w</p><p> Key words: C/S module; Socket; FTP; directly-controlling-screen/</p><p><b> 目 錄</b></p><p> 引言 …………………………………………………………………………3</p><p>
12、; 1 課題描述………………………………………………………………… 5</p><p> 1.1 任務(wù)內(nèi)容…………………………………………………………………… 5</p><p> 1.2 應(yīng)完成內(nèi)容………………………………………………………………… 5</p><p> 2 系統(tǒng)分析……………………………………………………………………6</p&
13、gt;<p> 2.1 系統(tǒng)功能分析…………………………………………………………………6</p><p> 2.2 系統(tǒng)軟件模型…………………………………………………………………6</p><p> 3 相關(guān)技術(shù) ……………………………………………………………… 7</p><p> 3.1 Socket的基本概念……………………………………
14、………………… 7</p><p> 3.1.1 Socket 引入……………………………………………………………7</p><p> 3.1.2 Socket的類型 …………………………………………………………7</p><p> 3.2 基本套接字函數(shù)調(diào)用…………………………………………………… 8</p><p> 3.2.1
15、創(chuàng)建套接字………………………………………………………………8</p><p> 3.2.2 指定本機(jī)地址……………………………………………………………8</p><p> 3.2.3 建立套接字連接…………………………………………………………8</p><p> 3.2.4 監(jiān)聽連接……………………………………………………………… 9 </p>
16、<p> 3.2.5 數(shù)據(jù)傳輸……………………………………………………………… 9</p><p> 3.2.6 關(guān)閉套接字………………………………………………………………10</p><p> 3.3 Windows系統(tǒng)的Socket編程……………………………………………10</p><p> 3.3.1 使用WinSock API…………………
17、……………………………………10</p><p> 3.3.2 使用數(shù)據(jù)報(bào)套接字………………………………………………………10</p><p> 3.3.3 使用流式套接字…………………………………………………………11</p><p> 3.4 Windows的消息系統(tǒng)………………………………………………… 14</p><p>
18、4 C/S模式遠(yuǎn)程控制程序設(shè)計(jì)實(shí)現(xiàn) …………………………………… 17</p><p> 4.1主要實(shí)現(xiàn)功能……………………………………………………………17</p><p> 4.2 客戶端(監(jiān)控端)設(shè)計(jì)實(shí)現(xiàn)…………………………………………………18</p><p> 4.2.1添加主機(jī)………………………………………………………………19</p>
19、;<p> 4.2.2發(fā)送消息 ………………………………………………………………20</p><p> 4.2.3監(jiān)視屏幕 ………………………………………………………………20</p><p> 4.2.4幫助 ………………………………………………………………… 21</p><p> 4.2.5 注冊………………………………………………………
20、……………21 </p><p> 4.3 服務(wù)器端(被監(jiān)控端)設(shè)計(jì)實(shí)現(xiàn)…………………………………………23</p><p> 4.3.1準(zhǔn)備接受連接 …………………………………………………………24</p><p> 4.3.2自動(dòng)運(yùn)行和隱藏……………………………………………………… 25</p><p> 4.3.3 文件管理的實(shí)
21、現(xiàn)…………………………………………………………26</p><p> 4.3.3.1 列文件目錄清單………………………………………………………28</p><p> 4.3.3.2 查看文件內(nèi)容…………………………………………………………29</p><p> 4.3.3.3 “文件傳輸”程序?qū)崿F(xiàn)……………………………………………………29</p>
22、<p> 4.3.4 系統(tǒng)信息的獲取及修改………………………………………………… 29</p><p> 4.3.5 遠(yuǎn)程重啟,關(guān)閉計(jì)算機(jī)的實(shí)現(xiàn)……………………………………………29</p><p> 4.3.6 鍵盤和鼠標(biāo)的控制……………………………………………………… 32</p><p> 4.3.7 遠(yuǎn)程屏幕抓取的實(shí)現(xiàn) ……………………
23、………………………………37</p><p> 4.3.8 其他功能模塊的實(shí)現(xiàn)…………………………………………………… 39</p><p> 5 總結(jié)與展望 …………………………………………………………… 39</p><p> 謝辭……………………………………………………………………………39</p><p> 參考文獻(xiàn) ………
24、……………………………………………………………39</p><p> 附錄………………………………………………………………………… 40</p><p><b> 引言:</b></p><p> 網(wǎng)絡(luò)在計(jì)算機(jī)世界里,越來越發(fā)揮著舉足輕重的作用,很多單位、部門都建立了自己的內(nèi)部網(wǎng)。對于網(wǎng)絡(luò)管理人員來說,在整個(gè)網(wǎng)絡(luò)運(yùn)行期間,希望能夠?qū)崟r(shí)的監(jiān)
25、控聯(lián)網(wǎng)計(jì)算機(jī)的運(yùn)行狀態(tài)和進(jìn)行一些相關(guān)操作;希望能夠傳輸文件;希望能夠防止病毒的蔓延、非法程序的拷貝、杜絕某些用戶的越權(quán)或非法操作等。為此,希望編寫一個(gè)適合于自己所在局域網(wǎng)的通訊程序。在此,本人使用VC 6.0開發(fā)了一套能在局域網(wǎng)內(nèi)的每臺計(jì)算機(jī)進(jìn)行實(shí)時(shí)監(jiān)控的網(wǎng)絡(luò)系統(tǒng)。這也就是所謂的遠(yuǎn)程控制軟件。那什么是遠(yuǎn)程控制?</p><p> 遠(yuǎn)程控制是在網(wǎng)絡(luò)上由一臺電腦(主控端Remote/客戶端)遠(yuǎn)距離去控制另一臺電腦(
26、被控端Host/服務(wù)器端)的技術(shù),這里的遠(yuǎn)程不是字面意思的遠(yuǎn)距離,一般指通過網(wǎng)絡(luò)控制遠(yuǎn)端電腦,不過,大多數(shù)時(shí)候我們所說的遠(yuǎn)程控制往往指在局域網(wǎng)中的遠(yuǎn)程控制而言。當(dāng)操作者使用主控端電腦控制被控端電腦時(shí),就如同坐在被控端電腦的屏幕前一樣,可以啟動(dòng)被控端電腦的應(yīng)用程序,可以使用被控端電腦的文件資料,甚至可以利用被控端電腦的外部打印設(shè)備(打印機(jī))和通信設(shè)備(調(diào)制解調(diào)器或者專線等)來進(jìn)行打印和訪問互聯(lián)網(wǎng),就像你利用遙控器遙控電視的音量、變換頻道或
27、者開關(guān)電視機(jī)一樣。不過,有一個(gè)概念需要明確,那就是主控端電腦只是將鍵盤和鼠標(biāo)的指令傳送給遠(yuǎn)程電腦,同時(shí)將被控端電腦的屏幕畫面通過通信線路回傳過來。也就是說,我們控制被控端電腦進(jìn)行操作似乎是在眼前的電腦上進(jìn)行的,實(shí)質(zhì)是在遠(yuǎn)程的電腦中實(shí)現(xiàn)的,不論打開文件,還是上網(wǎng)瀏覽、下載等都是存儲在遠(yuǎn)程的被控端電腦中的。</p><p> 電腦中的遠(yuǎn)程控制技術(shù),始于DOS時(shí)代,只不過當(dāng)時(shí)由于技術(shù)上沒有什么大的變化,網(wǎng)絡(luò)不發(fā)達(dá),市
28、場沒有更高的要求,所以遠(yuǎn)程控制技術(shù)沒有引起更多人的注意。但是,隨著網(wǎng)絡(luò)的高度發(fā)展,電腦的管理及技術(shù)支持的需要,遠(yuǎn)程操作及控制技術(shù)越來越引起人們的關(guān)注。遠(yuǎn)程控制一般支持下面的這些網(wǎng)絡(luò)方式:LAN、WAN、撥號方式、互聯(lián)網(wǎng)方式。此外,有的遠(yuǎn)程控制軟件還支持通過串口、并口、紅外端口來對遠(yuǎn)程機(jī)進(jìn)行控制(不過,這里說的遠(yuǎn)程電腦,只能是有限距離范圍內(nèi)的電腦了)。傳統(tǒng)的遠(yuǎn)程控制軟件一般使用NETBEUI、NETBIOS、IPX/SPX、TCP/IP等
29、協(xié)議來實(shí)現(xiàn)遠(yuǎn)程控制,不過,隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,目前很多遠(yuǎn)程控制軟件提供通過Web頁面以JAVA技術(shù)來控制遠(yuǎn)程電腦,這樣可以實(shí)現(xiàn)不同操作系統(tǒng)下的遠(yuǎn)程控制,例如數(shù)技通科技有限公司在去年就推出了全球第一套基于中文JAVA的跨平臺遠(yuǎn)程控制軟件――易控。</p><p> 遠(yuǎn)程控制軟件一般分兩個(gè)部分:一部分是客戶端程序Client,另一部分是服務(wù)器端程序Server,在使用前需要將客戶端程序安裝到主控端電腦上,將服務(wù)器端
30、程序安裝到被控端電腦上。它的控制的過程一般是先在主控端電腦上執(zhí)行客戶端程序,像一個(gè)普通的客戶一樣向被控端電腦中的服務(wù)器端程序發(fā)出信號,建立一個(gè)特殊的遠(yuǎn)程服務(wù),然后通過這個(gè)遠(yuǎn)程服務(wù),使用各種遠(yuǎn)程控制功能發(fā)送遠(yuǎn)程控制命令,控制被控端電腦中的各種應(yīng)用程序運(yùn)行,我們稱這種遠(yuǎn)程控制方式為基于遠(yuǎn)程服務(wù)的遠(yuǎn)程控制。通過遠(yuǎn)程控制軟件,我們可以進(jìn)行很多方面的遠(yuǎn)程控制,包括獲取目標(biāo)電腦屏幕圖像、窗口及進(jìn)程列表;記錄并提取遠(yuǎn)端鍵盤事件(擊鍵序列,即監(jiān)視遠(yuǎn)端鍵
31、盤輸入的內(nèi)容);可以打開、關(guān)閉目標(biāo)電腦的任意目錄并實(shí)現(xiàn)資源共享;提取撥號網(wǎng)絡(luò)及普通程序的密碼;激活、中止遠(yuǎn)端程序進(jìn)程;管理遠(yuǎn)端電腦的文件和文件夾;關(guān)閉或者重新啟動(dòng)遠(yuǎn)端電腦中的操作系統(tǒng);修改Windows注冊表;通過遠(yuǎn)端電腦上、下載文件和捕獲音頻、視頻信號等。</p><p> 前面所講的是一臺電腦對一臺電腦的情況,其實(shí),基于遠(yuǎn)程服務(wù)的遠(yuǎn)程控制最適合的模式是一對多,即利用遠(yuǎn)程控制軟件,我們可以使用一臺電腦控制多臺
32、電腦,這就不必為辦公室的每一臺電腦都安裝一個(gè)調(diào)制解調(diào)器,而只需要利用辦公室局域網(wǎng)的優(yōu)勢就可以輕松實(shí)現(xiàn)遠(yuǎn)程多點(diǎn)控制了。在進(jìn)行一臺電腦對多臺遠(yuǎn)端電腦進(jìn)行控制時(shí),遠(yuǎn)程控制軟件似乎更像一個(gè)局域網(wǎng)的網(wǎng)絡(luò)管理員,而提供遠(yuǎn)程控制的遠(yuǎn)程終端服務(wù)就像極了辦公室局域網(wǎng)的延伸。這種一對多的連接方式在節(jié)省了調(diào)制解調(diào)器的同時(shí),還使得網(wǎng)絡(luò)的接入更加安全可靠,網(wǎng)絡(luò)管理員也更易于管理局域網(wǎng)上的每一臺電腦。</p><p> 遠(yuǎn)程控制具有一下優(yōu)
33、點(diǎn):便于用戶能夠在任何地方通過網(wǎng)絡(luò)及時(shí),快速的訪問,控制自己的主機(jī)。特別是對于網(wǎng)絡(luò)管理員,技術(shù)服務(wù)人員來說,遠(yuǎn)程控制提供了一個(gè)便捷,高效的手段。</p><p> 當(dāng)然,遠(yuǎn)程控制軟件是一把雙刃劍,有優(yōu)點(diǎn)就會有缺點(diǎn),它存在比較嚴(yán)重的安全隱患。一方面給用戶和網(wǎng)絡(luò)管理員工作帶了很大的方便,另一方面也給一些居心不良者留下后門。形成很多木馬程序。這就需要對軟件在設(shè)計(jì)方面做一些安全考慮。</p><p&
34、gt; 本軟件就是基于此而設(shè)計(jì)開發(fā)的,能實(shí)現(xiàn)以下的基本的遠(yuǎn)程功能:</p><p> 1),查看被控制端的文件目錄清單;</p><p> 2),查看被控制端的文件內(nèi)容;</p><p> 3),拷貝被控制端的文件到控制端;</p><p> 4),強(qiáng)迫被控制端重新啟動(dòng)或關(guān)機(jī);</p><p> 5),修改
35、被控制端的系統(tǒng)配置文件;</p><p> 6),直接執(zhí)行任何可執(zhí)行命令,打開應(yīng)用程序;</p><p> 7),鎖?。ń怄i)被控制端的屏幕,鍵盤和鼠標(biāo);</p><p> 8),控制被控制端的屏幕,在本地直接操作被控制端計(jì)算機(jī);</p><p> 9),隱藏共享被控制端的硬盤;</p><p> 10),同
36、時(shí)可以做到被控端的服務(wù)器自動(dòng)運(yùn)行及隱藏等功能;</p><p> 而且做了一些必要的安全性考慮。</p><p><b> 1 課題描述:</b></p><p><b> 1.1 任務(wù)內(nèi)容</b></p><p> 基于Windows的遠(yuǎn)程控制軟件開發(fā)畢業(yè)設(shè)計(jì)的主要任務(wù)是要求做出從系統(tǒng)角度
37、</p><p> 計(jì)的遠(yuǎn)程控制模式,并制作相應(yīng)實(shí)用軟件。</p><p> 采用服務(wù)器(Server),客戶端(Client)模式,使用Socket編程的基本原理及Windows的消息系統(tǒng)。實(shí)現(xiàn)基本的遠(yuǎn)程控制要求,界面新穎友好。用VC開發(fā)!</p><p><b> 要求: </b></p><p> 1
38、).遠(yuǎn)程控制模式架構(gòu),如基于主從模式;</p><p> 2).遠(yuǎn)程控制功能實(shí)現(xiàn),如開關(guān)機(jī),遠(yuǎn)程監(jiān)視;</p><p> 3).遠(yuǎn)程控制安全考慮;</p><p> 4).遠(yuǎn)程控制實(shí)現(xiàn)平臺與技巧;</p><p> 5).遠(yuǎn)程控制軟件實(shí)現(xiàn),要求至少能在兩臺電腦上正常運(yùn)行;</p><p> 6).界面新穎友好
39、。</p><p><b> 1.2 應(yīng)完成內(nèi)容</b></p><p> 1),查看被控制端的文件目錄清單;</p><p> 2),查看被控制端的文件內(nèi)容;</p><p> 3),拷貝被控制端的文件到控制端;</p><p> 4),強(qiáng)迫被控制端重新啟動(dòng)或關(guān)機(jī);</p>
40、<p> 5),修改被控制端的系統(tǒng)配置文件;</p><p> 6),直接執(zhí)行任何可執(zhí)行命令,打開應(yīng)用程序;</p><p> 7),鎖住(解鎖)被控制端的屏幕,鍵盤和鼠標(biāo);</p><p> 8),控制被控制端的屏幕,在本地直接操作被控制端計(jì)算機(jī);</p><p> 9),隱藏共享被控制端的硬盤;</p>
41、<p> 10),同時(shí)可以做到被控端的服務(wù)器自動(dòng)運(yùn)行及隱藏等功能;</p><p> 11),補(bǔ)充:做不好的話,會帶來嚴(yán)重的安全隱患。會給一些居心不良的人留下后面。所以要同時(shí)做好相關(guān)的安全性考慮。</p><p><b> 2 系統(tǒng)分析</b></p><p> 2.1 系統(tǒng)功能分析</p><p>
42、; 本程序是由客戶端和服務(wù)器端兩部分組成的。而且需要客戶端和服務(wù)器端同時(shí)運(yùn)行相應(yīng)的程序來實(shí)現(xiàn)的。本軟件要實(shí)現(xiàn)的基本功能可以簡化如下:</p><p> 第一步,服務(wù)器端運(yùn)行相應(yīng)的遠(yuǎn)程控制軟件服務(wù)器程序,使服務(wù)器端的某個(gè)端口處于監(jiān)聽狀態(tài)(本軟件端口設(shè)置為4069)。這樣服務(wù)器端計(jì)算機(jī)就時(shí)刻處于監(jiān)聽遠(yuǎn)程計(jì)算機(jī)連接請求的狀態(tài)。</p><p> 第二步,當(dāng)服務(wù)器端程序運(yùn)行后,客戶端在本地計(jì)
43、算機(jī)中運(yùn)行相應(yīng)程序的客戶端程序,運(yùn)行這個(gè)客戶端程序時(shí),會指定一個(gè)要連接的服務(wù)器的IP地址和端口,(本軟件初始化的服務(wù)器地址是192.168.0.6,端口:4069),程序運(yùn)行后,點(diǎn)擊連接就會向所有的網(wǎng)絡(luò)搜索指定的計(jì)算機(jī)了。</p><p> 第三步,搜索到所指定的計(jì)算機(jī)后,客戶端計(jì)算機(jī)就向服務(wù)器端指定的端口發(fā)送連接請求(本軟件使用TCP連接),如果服務(wù)器端計(jì)算機(jī)同一端口處于監(jiān)聽狀態(tài),則服務(wù)器端接收客戶端的連接請
44、求,并根據(jù)設(shè)定的值向客戶端發(fā)送接受請求確認(rèn)信號,并同時(shí)向客戶端發(fā)出登錄成功信息確認(rèn)對話框。</p><p> 第四步,客戶端輸入登錄信息并確認(rèn)后,就會向服務(wù)器端發(fā)送,服務(wù)器端接收到客戶端發(fā)來的用戶信息后,就開始對客戶端所輸入的客戶進(jìn)行合法性確認(rèn),如果不符合登錄條件,則拒絕用戶的連接。</p><p> 第五步,如果服務(wù)器端確認(rèn)客戶端所輸入的用戶符合服務(wù)器端計(jì)算機(jī)的條件,則服務(wù)器端允許客
45、戶端進(jìn)行進(jìn)一步的連接,這樣,整個(gè)軟件的連接過程就完成了。</p><p> 2.2系統(tǒng)軟件模型 </p><p> 在本軟件設(shè)計(jì)中,采用典型的C/S結(jié)構(gòu),由客戶端與服務(wù)端兩部分構(gòu)成。客戶/服務(wù)器模式的最顯著特點(diǎn)是非對等作用,即客戶相對于服務(wù)器處于不平等的地位,服務(wù)端提供服務(wù),客戶端提供請求。結(jié)構(gòu)如圖2.1所示:</p><p> Server
46、 Client</p><p><b> 網(wǎng)絡(luò)</b></p><p><b> 服務(wù)響應(yīng)</b></p><p><b> 服務(wù)請求</b></p><p><b> 圖2.1 </b>
47、</p><p> 在設(shè)計(jì)客戶端和服務(wù)器時(shí),由于功能需求不同,我設(shè)計(jì)的客戶端界面簡單,面向?qū)ο螅⑶矣上鄳?yīng)的幫助文件,易于操作。而服務(wù)器端主要實(shí)現(xiàn)控制功能實(shí)現(xiàn)。而且不能讓用戶強(qiáng)行關(guān)閉,界面就簡單,而且要做到隱藏。其他詳細(xì)的功能模塊描述將在第四章具體功能模塊實(shí)現(xiàn)中給予描述。以下兩章詳細(xì)介紹了本程序的實(shí)現(xiàn)的基礎(chǔ)和過程:</p><p><b> 3 相關(guān)技術(shù)</b>&
48、lt;/p><p> 客戶/服務(wù)器技術(shù)是當(dāng)今比較流行與具有發(fā)展的技術(shù)之一。以之構(gòu)成的客戶、服務(wù)器應(yīng)用系統(tǒng)具有系統(tǒng)結(jié)構(gòu)優(yōu)化、資源利用率高、整體運(yùn)算速度快的優(yōu)點(diǎn),因而得到了廣泛的應(yīng)用。在WINDOWS應(yīng)用程序中,處理實(shí)時(shí)通訊最常用到的還是MICROSOFT公司提供的WinSock控件。</p><p> 3. 1 WinSock基本概念</p><p> 網(wǎng)絡(luò)客戶/服
49、務(wù)器模式的原理是一臺主機(jī)提供服務(wù)(服務(wù)器),另一臺主機(jī)接受服務(wù)(客戶機(jī))。作為服務(wù)器的主機(jī)打開一個(gè)端口并進(jìn)行監(jiān)聽, 如果有客戶機(jī)向服務(wù)器的這一端口提出連接請求, 服務(wù)器上的相應(yīng)程序就會自動(dòng)運(yùn)行,來應(yīng)答客戶機(jī)的請求。而WinSock的正確使用,給設(shè)計(jì)者帶來了極大的方便,使得各種應(yīng)用程序能夠在Windows環(huán)境下順利進(jìn)行各種網(wǎng)絡(luò)通訊。</p><p> 3.1.1 Socket 引入</p><
50、p> 20世紀(jì)80年代初,美國政府的高級研究工程機(jī)構(gòu)(ARPA)給加利福尼亞大學(xué)Berkeley分校提供資金,讓他們在UNIX操作系統(tǒng)下實(shí)現(xiàn)TCP/IP協(xié)議。在這個(gè)項(xiàng)目中,研究人員為TCP/IP網(wǎng)絡(luò)通信開發(fā)了一個(gè)應(yīng)用程序接口(API)。這個(gè)API就稱為Socket接口。今天,Socket接口是TCP/IP網(wǎng)絡(luò)最通用的API,也是在Internet上進(jìn)行應(yīng)用開發(fā)最為通用的API。</p><p> 實(shí)際上
51、,Socket在計(jì)算機(jī)中提供了一個(gè)通信端口(套接口)。通過這個(gè)端口,一臺計(jì)算機(jī)可以與任何一臺具有Socket接口的計(jì)算機(jī)通信。通信的基礎(chǔ)是套接口。一個(gè)套接口是通信的一端,在這一端上可以找到與其對應(yīng)的一個(gè)名字。一個(gè)正在被使用的套接口都有它的類型和與其相關(guān)的進(jìn)程,套接口存在于通信域中。一個(gè)討套接口通常和同一個(gè)域中的套接口交換數(shù)據(jù)(數(shù)據(jù)交換也可以穿越域的界限,單這時(shí)一定要執(zhí)行某種解釋程序)。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過這個(gè)套接口來實(shí)
52、現(xiàn)。在應(yīng)用開發(fā)種就像使用文件句柄一樣,可以對Socket句柄進(jìn)行讀寫操作。</p><p> 開始使用套接字編程之前,首先必須建立這些概念:網(wǎng)間進(jìn)程通訊,服務(wù)方式,客戶機(jī)/服務(wù)器模式。</p><p> 進(jìn)程通信的概念最初來源與單機(jī)系統(tǒng)。由于每個(gè)進(jìn)程都在自己的地址范圍內(nèi)運(yùn)行,為保證量相互通信的進(jìn)程之間既互不干涉又能協(xié)調(diào)一致工作,操作系統(tǒng)為進(jìn)程通信提供了相應(yīng)設(shè)施,如UNIX BSD中的管
53、道(Pipe)、命名管道(Named Pipe)和軟中斷信號(Signal)、UNIX System V的消息(Message)、共享存儲區(qū)(Shared Memory)和信號量(Semaphore)等,但都僅限于用在本機(jī)進(jìn)程之間的通信。網(wǎng)間進(jìn)程通信要解決的是不同計(jì)算機(jī)進(jìn)程間的相互通信問題(可把同機(jī)進(jìn)程通信看成是其中的一個(gè)特例)。為此,首先要解決的是網(wǎng)間進(jìn)程標(biāo)識問題,同一計(jì)算機(jī)上,不同進(jìn)程可以用進(jìn)程號(Process ID)作為唯一標(biāo)識
54、,但在網(wǎng)絡(luò)環(huán)境下,各個(gè)計(jì)算機(jī)獨(dú)立分配的進(jìn)程號不能唯一的標(biāo)識該進(jìn)程。例如,計(jì)算機(jī)甲賦予某進(jìn)程號48,在乙計(jì)算機(jī)中也可以存在48號進(jìn)程,因此,“48號進(jìn)程”這句話就沒有意義了。其次,操作系統(tǒng)支持的網(wǎng)絡(luò)協(xié)議眾多,不同的協(xié)議的工作方式不同,地址格式也不一樣,因此,網(wǎng)間進(jìn)程通信還要解決多重協(xié)議的識別問題。</p><p> 在網(wǎng)絡(luò)分層結(jié)構(gòu)中,各層之間是嚴(yán)格單向依賴的,各個(gè)層次的分工和協(xié)作集中體現(xiàn)在相鄰層之間的界面上?!胺?/p>
55、務(wù)”是描述相鄰層之間關(guān)系的抽象概念,即網(wǎng)絡(luò)中各層向緊鄰上層提供的一組操作。下層是服務(wù)提供者,上層是請求服務(wù)的用戶。服務(wù)的表現(xiàn)形式是原語(Primitive),如系統(tǒng)調(diào)用或庫函數(shù)等。系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核向網(wǎng)絡(luò)應(yīng)用程序或高層協(xié)議提供的服務(wù)原語。在國際標(biāo)準(zhǔn)化組織(ISO)的術(shù)語中,網(wǎng)絡(luò)層及其以下各層又稱為通信子網(wǎng),只是提供點(diǎn)到點(diǎn)的通信,沒有程序或進(jìn)程的概念。而傳輸層實(shí)現(xiàn)的是“端到端”通信,引進(jìn)網(wǎng)間進(jìn)程通信概念,同時(shí)也要解決差錯(cuò)控制、流量控制
56、、數(shù)據(jù)排序(報(bào)文排序)及連接管理等問題。為此提供不同的服務(wù)方式:面向連接(虛電路)的服務(wù)或無連接的服務(wù)。面向連接服務(wù)是電話系統(tǒng)服務(wù)模式的抽象,即每一次完整的數(shù)據(jù)傳輸都要經(jīng)過建立連接,使用連接及終止連接的過程。在數(shù)據(jù)傳輸過程中,各數(shù)據(jù)分組不攜帶目的地址,而使用連接號(Connect ID)。本質(zhì)上,連接是一個(gè)管道,收發(fā)數(shù)據(jù)不但順序一致,而且內(nèi)容相同。其中TCP協(xié)議就提供面向連接的虛電路。無連接的服務(wù)是郵政系統(tǒng)服務(wù)的抽象,每個(gè)分組都攜帶完整
57、的目的地址,各分組在系</p><p> 在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信的兩個(gè)進(jìn)程間相互作用的主要模式就是客戶機(jī)/服務(wù)器模式(Client/Server)。即客戶向服務(wù)發(fā)出服務(wù)請求,服務(wù)接收到請求后,提供相應(yīng)的服務(wù)??蛻魴C(jī)/服務(wù)器模式的建立基于以下兩點(diǎn):首先,建立網(wǎng)絡(luò)的起因是網(wǎng)絡(luò)中軟硬件資源、運(yùn)算能力和信息不均等,需要共享,從而造就擁有眾多資源的主機(jī)提供服務(wù),資源較少的客戶請求服務(wù)這一非對等作用;其次,網(wǎng)間進(jìn)程
58、通信完全是異步的,相互通信的進(jìn)程間既不存在父子關(guān)系,又不共享內(nèi)存緩沖區(qū),因此需要一種機(jī)制為希望通信的進(jìn)程間建立聯(lián)系,為兩者的數(shù)據(jù)交換提供同步,這就是基于客戶機(jī)/服務(wù)器式的TCP/IP。</p><p> 3.1.2 Socket的類型</p><p> TCP/IP的Socket提供下列三種類型套接字。</p><p> 1, 流式套接字(SOCKSTREAM
59、)</p><p> 如果我們想讓發(fā)送出去的數(shù)據(jù)按順序無重復(fù)地到達(dá)目的地,那么就需要使用流式套接字。流式套接字提供一種可靠的面向連接地傳輸方法。數(shù)據(jù)無差錯(cuò),無重復(fù)地發(fā)送,而且按發(fā)送地順序進(jìn)行接收。不過對單個(gè)地?cái)?shù)據(jù)報(bào),還是對整個(gè)數(shù)據(jù)包,流式套接字都提供一種流式數(shù)據(jù)傳輸,流式套系在使用TCP。此外,在數(shù)據(jù)傳輸時(shí),如果連接斷開,應(yīng)用程序會被通知。流式套接字內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看成字節(jié)流,無長度限制。F
60、TP使用這種。</p><p> 2,數(shù)據(jù)報(bào)套接字(SOCKE_DGRM)</p><p> 數(shù)據(jù)報(bào)套接字提供一種不可靠的,非連接的數(shù)據(jù)包(Packet)通信方式。在這里,”不可靠”是指發(fā)送一個(gè)數(shù)據(jù)包不能獲得擔(dān)保,也不能保證數(shù)據(jù)包按照發(fā)送的順序到達(dá)目的地。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且順序混亂。在實(shí)現(xiàn)上,同一分組數(shù)據(jù)報(bào)可能不止一次的被發(fā)送。對于Win
61、Sock的TCP/IP實(shí)現(xiàn),數(shù)據(jù)報(bào)套接字使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP)。雖然在通常情況下,在同一臺計(jì)算機(jī)傻瓜或在輕負(fù)載的局域網(wǎng)所連接的兩臺計(jì)算機(jī)的進(jìn)程之間進(jìn)行通信時(shí),可能不會出現(xiàn)數(shù)據(jù)包不被發(fā)送或沒按照順序到達(dá)及又重復(fù)發(fā)送的情況,但在編寫應(yīng)用程序時(shí),應(yīng)該注意檢測意外發(fā)生的事件,應(yīng)具備處理出現(xiàn)這些情況的能力。當(dāng)然,如果為非常復(fù)雜的網(wǎng)絡(luò)(如Internet)編寫通信應(yīng)用程序,就應(yīng)該考慮到數(shù)據(jù)報(bào)套接字的不可靠性。如果我們的應(yīng)用程序沒有處理好這個(gè)問
62、題,它就有可能崩潰。盡管如此,數(shù)據(jù)報(bào)套接字在發(fā)送數(shù)據(jù)包或者記錄形數(shù)據(jù)時(shí)仍然有用。另外,數(shù)據(jù)報(bào)套接字還提供向多個(gè)目的地發(fā)送廣播數(shù)據(jù)包的能力。</p><p> 3 原始套接字(SOCKE_RAW)</p><p> 該接口允許對較低層協(xié)議,如IP,ICMP的直接訪問。它通常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問現(xiàn)有服務(wù)配置中的新設(shè)備</p><p> 3.2 基本套接字
63、函數(shù)調(diào)用</p><p> 大多數(shù)的數(shù)據(jù)報(bào)套接字應(yīng)用程序都使用一個(gè)規(guī)定的事件序列來完成客戶應(yīng)用程序與服務(wù)器應(yīng)用程序間的通信,如圖3.1所示:</p><p><b> 圖3.1 </b></p><p> 首先,客戶端和服務(wù)器端都要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字。接著,服務(wù)器調(diào)用bind()函數(shù)給套接字分配工人的端口(在開發(fā)應(yīng)用程序時(shí),這個(gè)公認(rèn)的端
64、口通常時(shí)指定的。例如本程序的端口就指定為4069)。這樣,客戶端和服務(wù)器端就使用同一個(gè)端口來表示服務(wù)器套接字。一旦服務(wù)器將公認(rèn)的端口分配給了套接字,客戶端和服務(wù)器端都能使用sendto()和recvfrom()來發(fā)送和接收數(shù)據(jù)報(bào)直到完成傳輸。然后調(diào)用closesocket()來關(guān)閉套接字。下面具體看從給定套接字的一個(gè)地址開始的每一步工作時(shí)怎樣進(jìn)行的。</p><p> 3.2.1創(chuàng)建套接字</p>
65、<p> 系統(tǒng)調(diào)用socket()函數(shù)向應(yīng)用程序提供套接字手段時(shí)的聲明如下:</p><p> SOCKET PASCAL FAR socket(int af, int type, int protocol);</p><p> 該函數(shù)有三個(gè)參數(shù),其中參數(shù)af指定通信發(fā)生的區(qū)域,在DOS,Windows系統(tǒng)中支持AF_INET,它時(shí)網(wǎng)際網(wǎng)區(qū)域。</p>
66、<p> 參數(shù)type描述要建立套接字的類型。也就是指是流式套接字還是數(shù)據(jù)報(bào)套接字。</p><p> 參數(shù)protocol說明該套接字使用的協(xié)議,如果該參數(shù)為0,則表示使用默認(rèn)的連接模式。</p><p> Socket()函數(shù)根據(jù)這三個(gè)參數(shù)建立一個(gè)套接字,并將相應(yīng)的資源分配給它,同時(shí)返回一個(gè)整形套接字句柄。</p><p> 3.2.2 指定
67、本機(jī)地址</p><p> 當(dāng)一個(gè)套接字用socket()創(chuàng)建以后,bind()將套接字地址(主機(jī)地址和端口)與所創(chuàng)建的套接字編號聯(lián)系起來,即將名字賦予套接字。bind()聲明如下:</p><p> int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR *name, int namelen);</p>&l
68、t;p> bind()函數(shù)共有三個(gè)參數(shù),其中參數(shù)s是由socket()函數(shù)調(diào)用返回的并且未連接的套接字句柄。</p><p> 參數(shù)name是賦給套接字s的本地地址。參數(shù)namelen指參數(shù)name的長度,調(diào)用成功,返回0;否則返回SOCKET_ERROR。</p><p> 3.2.3 建立套接字連接</p><p> 建立套接字是要用connect
69、()與accept()。connect()函數(shù)的原型聲明如下:</p><p> int PASCAL FAR connect (SOCKET s,const struct sockaddr FAR *name,int namelen);</p><p> Connect()共有三個(gè)參數(shù),其中s指要建立連接的本屆套接字句柄。參數(shù)name指對方套接字地址結(jié)構(gòu)的指針,對方套接字地址長度由參
70、數(shù)namelen說明。如果調(diào)有成功,返回0;否則返回SOCKET_ERROR。</p><p> Accept()函數(shù)原型聲明如下:</p><p> SOCKETPASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr,int FAR*addrlen);</p><p> 該函數(shù)也由三個(gè)參數(shù),其中參數(shù)s為本地
71、套接字句柄,在做accept函數(shù)調(diào)用的參數(shù)前要先調(diào)用listen(),參數(shù)addr是指向客戶方套接字地址結(jié)構(gòu)的指針,用來接收連接實(shí)體的地址。addr的確切格式由套接字創(chuàng)建時(shí)建立的地址簇決定。參數(shù)addrlen為客戶方套接字地址的長度。</p><p> 如果調(diào)用成功,accept()函數(shù)返回一個(gè)SOCKET類型的值。否則返回INVALID_SOCKET。</p><p> Socket
72、(),bind(),connect(),accept()這四個(gè)套接字系統(tǒng)調(diào)用可以晚上一個(gè)完全的通信建立,包括協(xié)議,本地主機(jī)地址和端口,目的地址和端口。socket()指定協(xié)議元,他的用法與是否為客戶機(jī)和服務(wù)器,是否面向連接無關(guān),bind()指定本機(jī)地址和端口號,時(shí)面向連接的。在服務(wù)器方必須調(diào)用bind()函數(shù);</p><p> 3.2.4 監(jiān)聽連接</p><p> 建立連接以后,服
73、務(wù)器端要調(diào)用listen()函數(shù),表明愿意接收連接,listen()要在accept()之前調(diào)用,原函數(shù)聲明如下:</p><p> int PASCAL FAR listen(SOCKET s,int backlog);</p><p> 該函數(shù)有兩個(gè)參數(shù),參數(shù)s標(biāo)志一個(gè)本地已建立單尚未連接的套接字句柄,服務(wù)器愿意從它上面接收請求。參數(shù)backlog表示請求連接隊(duì)列的最大長度,用于限
74、制排隊(duì)的請求個(gè)數(shù),目前最大值為5。如果調(diào)用成功,listen()函數(shù)返回0;否則返回SOCKET_ERROR。</p><p> 3.2.5 數(shù)據(jù)傳輸</p><p> 當(dāng)連接建立以后,就可以傳輸數(shù)據(jù)了,通常調(diào)用send()和recv()函數(shù)。</p><p> send()函數(shù)原型聲明如下:</p><p> int PASCAL
75、FAR send(SOCKET s,const char FAR *buf,int len,int flags);</p><p> 共有四個(gè)參數(shù),其中s為已經(jīng)連接的本地套接字句柄。buf指向存有發(fā)送數(shù)據(jù)的緩沖區(qū)指針,長度有l(wèi)en指定。flags智利隊(duì)傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)等。如果調(diào)用成功,返回總發(fā)送的字節(jié)數(shù);否則,返回SOCKET_ERROR。</p><p> Recv(
76、)函數(shù)調(diào)用用于在參數(shù)s指定的已經(jīng)連接的數(shù)據(jù)報(bào)或流套接字上接收輸入數(shù)據(jù),原型聲明如下:</p><p> Int PASCAL FAR recv(SOCKET s ,char FAR *buf, int len,int flags);</p><p> 參數(shù)的意義同send();</p><p> 3.2.6 關(guān)閉套接字</p><p>
77、 closesocket()關(guān)閉套接字s并釋放分配給該套接字的資源,cosesocket()函數(shù)原型聲明如下:</p><p> BOOLPASCAL FAR close socket(SOCKET s);</p><p> 該函數(shù)只有一個(gè)參數(shù)s,指待關(guān)閉的套接字句柄。如果調(diào)用成功,返回0,否則返回SOCKET_ERROR。</p><p> 3.3 Wi
78、ndows系統(tǒng)的Socket編程 </p><p> 3.3.1 使用WinSock API</p><p> WinSock API在使用之前必須經(jīng)過初始化。可以使用WSAStartup()函數(shù)來完成。其聲明如下:</p><p> Int WSAStarup(WORD wVersionRequested,LPWSADATA lpWSAData);</
79、p><p> 該函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)WORD(雙字節(jié))類型數(shù)值,他指要使用的WinSock規(guī)范的最高版本。其中主版本在低位字節(jié),副版本號在高位字節(jié)。第二個(gè)參數(shù)是指向WSADATA結(jié)構(gòu)的指針。該結(jié)構(gòu)里有成員 wVersion規(guī)定WinSock的版本號,如果返回的wVersion成員中的版本號不能被應(yīng)用程序所接受,我們就應(yīng)該調(diào)用WSACleanup()并且退出應(yīng)用程序。</p><p&g
80、t; 聲明完套接字,接下來就可以用socket()函數(shù)創(chuàng)建一個(gè)套接字,聲明如下:</p><p> SOCKET PASCAL FAR socket(int af,int type,int protocol);</p><p> 其中af指這個(gè)套接字要使用的Internet地址。參數(shù)type指所創(chuàng)建的套接字的類別。protocol指套接字使用的協(xié)議,如果為0,就自動(dòng)選擇一個(gè)合適的協(xié)議
81、。</p><p> 在WinSock1.1中,socket()采用如下調(diào)用:</p><p><b> SOCKET </b></p><p> myUDPSock =socket(AF_INET,SOCKET_DGRAM,IPPROTO_UDP)</p><p><b> 流式套接字:</b&
82、gt;</p><p> SOCKET myTOPSock=socket(AF_INET,SOCKET_DGRAM,IPPROTO_TOP)</p><p> 3.3.2 使用數(shù)據(jù)報(bào)套接字</p><p> 在使用數(shù)據(jù)報(bào)套接字時(shí),首先,要調(diào)用bind()函數(shù),聲明如下:</p><p> int PASCAL FAR bind (SO
83、CKET s,const struct sockaddr FAR *addr,int namelen);</p><p> 其中s指要綁定的套接字句柄,addr時(shí)一個(gè)地址結(jié)果sockaddr_in,用來指定一個(gè)IP地址,結(jié)構(gòu)如下:</p><p> Struct sockaddr_in</p><p><b> {</b></p&g
84、t;<p> Short sin_family;(AF_INET)</p><p> U_short sin_port;(端口)</p><p> Struct in_addr sin_addr,;(地址)</p><p> Char sin_aero[8];(填充數(shù))</p><p><b> }</
85、b></p><p> namelen 是指參數(shù)addr的長度。</p><p> 一旦在服務(wù)器端創(chuàng)建了一個(gè)套接字,并且賦給了特定的地址和端口,就可以隨時(shí)接收來自客戶端賭數(shù)據(jù),我用了recvfrom()函數(shù)來實(shí)現(xiàn)的。</p><p> int recvfrom(SOCKET s,char FAR *buf, int len,int flags,struc
86、t sockaddr FAR *from,int FAR *fromlen );</p><p> 參數(shù)flags可以指定為MSG_PEEK,可以取出數(shù)據(jù)填入緩沖去,但仍會吧數(shù)據(jù)報(bào)留在輸入隊(duì)列。后面的兩個(gè)參數(shù)用來返回發(fā)送數(shù)據(jù)報(bào)的套接字地址,然后就可以使用這個(gè)地址向發(fā)送者發(fā)回一個(gè)答復(fù)。如果數(shù)據(jù)報(bào)讀入成功,則返回接收的字節(jié)數(shù),否則返回SOCKET_REEOR。。</p><p> 發(fā)送數(shù)據(jù)
87、可以用sendto()函數(shù)實(shí)現(xiàn),原型為:</p><p> int sendto(SOCKET s,const char FAR *buf ,int len,int flags,const struct sockaddr FAR *to ,int to len)。</p><p> 參數(shù)意義與recvfrom()類似。</p><p> 3.3.3 使用流式套
88、接字</p><p> 由于流式套接字使用的是基于連接的協(xié)議,所以,它要先建立連接,然后才能讀數(shù)據(jù),</p><p> 和數(shù)據(jù)報(bào)套接字一樣,流式套接字也由socket()函數(shù)來創(chuàng)建,而且,用時(shí)必須用bind()函數(shù)為他分配一個(gè)地址,在創(chuàng)建一個(gè)套接字時(shí),使用流式套接字與數(shù)據(jù)報(bào)套接字唯一不同的是,socket()調(diào)用傳遞的是SOCK_STREAM,而不是SOCK_DGRAM。</p&
89、gt;<p> 當(dāng)已經(jīng)建立了套接字,并賦給它一個(gè)地址后,需要移植方法建立和客戶端的連接,為了做到這一點(diǎn),要使用監(jiān)聽連接。我使用了listen()函數(shù),聲明如下:</p><p> int listen(SOCKET s,int backlog)</p><p> 參數(shù)Backlog告訴WinSock應(yīng)用程序能接收多少個(gè)請求。</p><p>
90、一旦套接字設(shè)置成監(jiān)聽,實(shí)際的連接要accept()函數(shù)來完成。函數(shù)accept()聲明如下:</p><p> SOCKET accept(SOCKET s,struct sockaddr FAR *addr,int FAR *addrlen);</p><p> 與bind()和recvfrom()函數(shù)一樣使用了sock_addr結(jié)構(gòu)。如果連接成功的接受,accept()函數(shù)返回一個(gè)
91、新的套接字句柄。如果出現(xiàn)錯(cuò)誤,則返回INVALID_SOCKET,這時(shí),可以調(diào)用WSAGetLastError()來得到更高關(guān)于錯(cuò)誤的細(xì)節(jié)。原來的套系在將繼續(xù)監(jiān)聽新的連接請求,新的請求可能會通過accept()函數(shù)的再一次調(diào)用而獲得。</p><p> 為了讓服務(wù)器接受請求,必須先發(fā)送請求,客戶端程序通過connect()函數(shù)來做這一點(diǎn)的,原型聲明如下:</p><p> int co
92、nnect(SOCKET s,const struct sockaddr FAR *name,int namelen);</p><p> 參數(shù)sockaddr和namelen用來指定要連接的套系在的地址和端口。傳給connect()函數(shù)的sockaddr結(jié)構(gòu)和給服務(wù)器bind()函數(shù)的sockaddr結(jié)構(gòu)是一樣的。</p><p> 一旦客戶端和服務(wù)器端建立了連接,就可以通過send
93、()函數(shù)調(diào)用來發(fā)送數(shù)據(jù)了</p><p> int send(SOCKET s,const char FAR *buf,int len,int flags);</p><p> 參數(shù)buf和len分別指向?qū)⒂邪l(fā)送的數(shù)據(jù)的指針和長度。參數(shù)flags參數(shù)可以指定為MSG_DONTROUTE,告訴WinSock在發(fā)送數(shù)據(jù)時(shí),不要使用循環(huán)消息。。</p><p> 為
94、了從流式套接字接收數(shù)據(jù),可以使用recv()函數(shù):</p><p> int recv (SOCKET s,char FAR *buf,int leg,int falgs);</p><p> 參數(shù)flags可設(shè)置成MS-OOB,用來接收帶外數(shù)據(jù),或設(shè)置成MSG-PEEK用來向緩沖區(qū)填入接收到的數(shù)據(jù)。對于套接字來說,如果數(shù)據(jù)按照輸入的隊(duì)列接收過來的,recv()函數(shù)返回讀入數(shù)據(jù)的字節(jié)數(shù)
95、,否則,recv()將返回SOCKET_ERROR,并且WSAGetLastError()給出具體的錯(cuò)誤。</p><p> 在默認(rèn)的狀態(tài)下,當(dāng)套接字由socket()函數(shù)創(chuàng)建后,它被設(shè)置為對I/O操作的阻塞狀態(tài)。 就要用到WSAAsyncSelect()函數(shù)。它預(yù)先在特定的時(shí)間發(fā)生時(shí),指定一個(gè)送往應(yīng)用程序的Windows消息。聲明如下:</p><p> intWSAAsyncSel
96、ect(SOCKET s,HWND hWnd,unsigned int wMsg long lEvent);參數(shù)hWnd指定將要發(fā)送消息的窗口句柄,這個(gè)消息時(shí)由參數(shù)wMsg指定的。通常wMsg指定一個(gè)用戶定義的消息WM_USER+n參數(shù)lEvent指定讓W(xué)inSock發(fā)送消息的事件,這個(gè)值由以下狀態(tài)通過操作符(|)結(jié)合而來:</p><p> FD_READ 數(shù)據(jù)正等待被讀入</p><
97、p> FD_WRITE 套接字正準(zhǔn)備寫數(shù)據(jù)</p><p> FD_OOB 帶外數(shù)據(jù)正等待被讀入。</p><p> FD_ACCEPT 一個(gè)新來的連接正等待被接收。</p><p> FD_CONNECT 套接字連接已經(jīng)完成</p><p> FD_CLOSE 套接字連接已經(jīng)關(guān)閉。</p><
98、p> 當(dāng)完成一個(gè)套系在操作后,就要用closesocket()函數(shù)將它關(guān)閉。</p><p> 3.4 windows的消息系統(tǒng)</p><p> Windows 程序時(shí)基于一種事件驅(qū)動(dòng)的編程模式,這就意味著應(yīng)用程序所要做的大部分工作時(shí)隨著Windows消息的變化而進(jìn)行的。在本程序的實(shí)現(xiàn)過程中,涉及大量的系統(tǒng)消息處理和自定義消息的處理。因此,用到如何使用處理C++類的消息。&l
99、t;/p><p> 3.4.1 消息的種類</p><p> 應(yīng)用程序所要做的每項(xiàng)工作幾乎都是基于處理Windows消息的,這些消息以三種基本形式出現(xiàn):常用的Windows、控件通知和命令。</p><p> Windows消息的ID通常加上前綴WM_,例如WM_QUIT。這些前綴為WM_的消息代表發(fā)生在應(yīng)用程序中的窗口和視圖處理消息(MFC為這些消息中的絕大部分
100、提供了默認(rèn)的操作)。</p><p> 控件消息是由子窗口傳向主窗口的WM_COMMAND消息。例如,只要編輯控件的當(dāng)前內(nèi)容被改變,它就會傳遞一個(gè)EN_CHANGE消息到主窗口(通常是對話框)。Windows消息控件通知通常由窗口對象來處理,即由類CWnd所派生的對象處理。</p><p> 命令是由菜單、按鈕(包括工具條)和快捷鍵傳遞來的WM_COMMAND消息。很多類可以處理命令消
101、息,其中包括文檔、文檔模板、窗口、視圖和應(yīng)用程序及本身。</p><p> 3.4.2 MFC中的消息處理</p><p> MFC為窗口下的消息處理提供了一種框架,使其使用起來比傳統(tǒng)的Windows程序下做控件的消息處理的swithc …case語句和if…else語句更為簡單。這是由于從CcomTarge派生的類能夠擁有自己的消息映射。MFC用用戶類的消息映射來決定怎樣處理已經(jīng)給定
102、的消息。使我們能最大限度的利用C++語言的優(yōu)點(diǎn)將我們的類進(jìn)行功能性封裝,這樣,由這些類所創(chuàng)建的其他類就不用再次重復(fù)操作。</p><p> MFC為了進(jìn)一步擴(kuò)展重復(fù)使用性,它為大多數(shù)Windows應(yīng)用程序,甚至范圍更廣的命令提供了默認(rèn)操作。大多數(shù)有默認(rèn)操作的命令同時(shí)也被包含在由AppWizard產(chǎn)生的默認(rèn)菜單中。由AppWizard創(chuàng)建的菜單的標(biāo)準(zhǔn)命令消息在AFXRES.H中定義,例如,F(xiàn)ile|New菜單項(xiàng)產(chǎn)
103、生一個(gè)有ID號為ID_FILE_NEW消息。其他的標(biāo)準(zhǔn)命令也有同樣的命名規(guī)則,這個(gè)規(guī)則就是ID_+菜單名+命令名。如果想執(zhí)行這些標(biāo)準(zhǔn)操作之一,可以從應(yīng)用程序中的任何一處發(fā)送一則預(yù)定義號的命令消息,這一消息就能被MFC進(jìn)行默認(rèn)處理。當(dāng)然,也可以對這些命令實(shí)現(xiàn)自己的處理。</p><p> 3.4.3 用ClassWizard進(jìn)行消息處理</p><p> 對于絕大多數(shù)的消息處理任務(wù)來說,
104、ClassWizard能提供極大的幫助。ClassWizard通過使用其中的消息映射項(xiàng),能將消息映射成各種類所對應(yīng)的處理程序。在程序設(shè)計(jì)階段,可以使用View菜單或用Ctrl+W來啟動(dòng)ClassWizard。選擇消息映射鍵后,將出現(xiàn)一個(gè)如圖3.2的對話框。</p><p><b> 圖3.2</b></p><p> 如果在工作區(qū)中有多個(gè)任務(wù),首先需要在Proje
105、ct項(xiàng)中選擇合適的入口,然后在類名項(xiàng)中選擇一個(gè)由CCmdTarge所創(chuàng)建的類。這樣將給我們提供一個(gè)對象ID列表,這些對象所接收到的消息以及在成員函數(shù)中已經(jīng)實(shí)現(xiàn)了的成員函數(shù)表。</p><p> “Project”項(xiàng)指項(xiàng)目名稱列表?!癈lass name”項(xiàng)指類名列表。</p><p> “Object IDs”項(xiàng)出現(xiàn)的對象有三種不同的類型:在“Class name”中列出的類,菜單項(xiàng)對
106、象以及其他在“Class name”中所選的類傳遞消息的控件。</p><p> 當(dāng)從“Object IDs”項(xiàng)中選擇類名時(shí),會在“Messages”項(xiàng)中列出選中項(xiàng)所能接收的所有Windows消息(也包括一些函數(shù),如InitInstance或Create,這根本不是消息處理程序。然而,ClassWizard允許與在別處一樣管理這些函數(shù))。ClassWizard對所有可見的Windows只顯示特定的幾個(gè)項(xiàng),這是基
107、于“Class Info”頁中的消息過濾器,它幫助我們把在特定的類中不常處理的消息選出來。如果想處理一個(gè)沒有列出的消息,就試著換一個(gè)消息過濾器。</p><p> 在“Object IDs”中列出的三個(gè)種類形的對象都是可以向類發(fā)送消息的控件。對于一些簡單的控件按鈕,我們只能接到有限的消息,如BN_CLICKED和BN_DOUBLECLIECKED。對復(fù)雜一些的對象,如編輯控件,就能處理許多不同的控件通知。當(dāng)從“
108、Object IDs”選擇了菜單命令,如IDC_LOGIN時(shí),就會在Message向看到兩個(gè)入口,分別時(shí)BN_CLICKED(單擊事件)和BN_DOUBLECLICKED(雙擊事件)。如果再選擇BN_CLICKED,就會在“Member functions”項(xiàng)中看到與該事件對應(yīng)的處理函數(shù),“Edit Code”、“Delete Function”和“Add Function”分別指編輯,刪除和添加給處理函數(shù)。</p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于Internet遠(yuǎn)程控制系統(tǒng)實(shí)時(shí)性研究.pdf
- 畢業(yè)論文---采用嵌入式移動(dòng)網(wǎng)絡(luò)的遠(yuǎn)程控制系統(tǒng)
- dtmf遠(yuǎn)程控制系統(tǒng)設(shè)計(jì)
- 溫室大棚的遠(yuǎn)程控制技術(shù)畢業(yè)論文
- 智能遠(yuǎn)程倉庫監(jiān)控系統(tǒng)畢業(yè)論文
- 對于遠(yuǎn)程控制系統(tǒng)的透明度的實(shí)時(shí)估計(jì).pdf
- 泵站遠(yuǎn)程控制系統(tǒng)研究
- 基于ZigBee技術(shù)的智慧農(nóng)業(yè)實(shí)時(shí)采集和遠(yuǎn)程控制系統(tǒng).pdf
- 基于java的遠(yuǎn)程控制軟件設(shè)計(jì)【畢業(yè)論文】
- 畢業(yè)論文--智能遠(yuǎn)程控制led顯示設(shè)備設(shè)計(jì)
- 基于IOCP的遠(yuǎn)程控制系統(tǒng).pdf
- 灌區(qū)閘門遠(yuǎn)程控制系統(tǒng)設(shè)計(jì).pdf
- 泵站遠(yuǎn)程控制系統(tǒng)研究.pdf
- 溫度控制系統(tǒng)畢業(yè)論文
- cs模式遠(yuǎn)程控制程序設(shè)計(jì)畢業(yè)論文
- 畢業(yè)論文--溫度控制系統(tǒng)
- 鍋爐控制系統(tǒng)畢業(yè)論文
- 帆板控制系統(tǒng)-畢業(yè)論文
- cs模式遠(yuǎn)程控制程序設(shè)計(jì)畢業(yè)論文
- 簡單遠(yuǎn)程控制系統(tǒng)-被控端設(shè)計(jì)
評論
0/150
提交評論