




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、網(wǎng)絡(luò)編程基礎(chǔ)1.1計(jì)算機(jī)網(wǎng)絡(luò)概述計(jì)算機(jī)網(wǎng)絡(luò)把分布在不同地點(diǎn)且具有獨(dú)立功能的多個(gè)計(jì)算機(jī)系統(tǒng)通過通信設(shè)備和線路連接起來,在功能完善的軟件和協(xié)議的管理下實(shí)現(xiàn)網(wǎng)絡(luò)中資源共享。在工控領(lǐng)域,現(xiàn)場(chǎng)數(shù)據(jù)的采集、傳輸及控制信息的發(fā)送都依賴于計(jì)算機(jī)網(wǎng)絡(luò)來實(shí)現(xiàn)。1.2、網(wǎng)絡(luò)參考模型為什么要對(duì)網(wǎng)絡(luò)進(jìn)行分層設(shè)計(jì)?在計(jì)算機(jī)通信過程中需要通信協(xié)議,但因傳輸介質(zhì)的不同、計(jì)算機(jī)本身的差異以及數(shù)據(jù)格式的不同等因素,致使網(wǎng)絡(luò)通信相當(dāng)復(fù)雜,為了降低復(fù)雜性,OSI提出了協(xié)議分層的參考模型,即OSI七層互聯(lián)參考模型。因?yàn)镺SI的網(wǎng)絡(luò)模型標(biāo)準(zhǔn)比較嚴(yán)格,另外推出的時(shí)間也相對(duì)較晚,所以目前還沒有完全按照OSI模型實(shí)現(xiàn)的網(wǎng)絡(luò)。TCP/IP是
2、目前實(shí)際應(yīng)用最廣泛的一種網(wǎng)絡(luò)模型,在這個(gè)模型中,不只是劃分了功能層,還有具體的實(shí)現(xiàn)技術(shù),即協(xié)議。TCP和IP就是這個(gè)模型中最重要的兩個(gè)層次的代表協(xié)議。 1.2.1、OSI和TCP/IP參考模型在網(wǎng)絡(luò)的不同分層中有不同的協(xié)議,計(jì)算機(jī)只能在同一層次上進(jìn)行通信,如下圖:雖然TCP/IP不是完全符合OSI的參考模型,但在層次上也存在著對(duì)應(yīng)關(guān)系,如下圖:1.2.2、數(shù)據(jù)流向在網(wǎng)絡(luò)的層次模型中,每一層與相鄰層之間都留有接口,較低層通過接口為上一層提供服務(wù),中間層就像個(gè)翻譯一樣,如下圖為經(jīng)典的中德教師的對(duì)話過程:在TCP/IP網(wǎng)絡(luò)模型中,數(shù)據(jù)在從應(yīng)用層向網(wǎng)絡(luò)接口層(鏈路層)傳遞的過程中,每經(jīng)過一層都要加入該
3、層的相應(yīng)的協(xié)議內(nèi)容,這樣數(shù)據(jù)在鏈路層形成了完整的數(shù)據(jù)包,該數(shù)據(jù)包到達(dá)接收方后,數(shù)據(jù)包從鏈路層到應(yīng)用層進(jìn)行逐層解析,在接收方應(yīng)用層解析得到的數(shù)據(jù)就是發(fā)送方在應(yīng)用層發(fā)送的數(shù)據(jù),數(shù)據(jù)進(jìn)行逐層封裝和解析的過程如下圖:1.2.3、IP分類IP地址在網(wǎng)絡(luò)層中定義,長(zhǎng)度為32個(gè)二進(jìn)制位,分為4段,每段8位,用于主機(jī)在網(wǎng)絡(luò)中的標(biāo)識(shí),IP地址有兩部分組成,一部分為網(wǎng)絡(luò)地址,另一部分為主機(jī)地址。IP地址分為A、B、C、D、E 共5類,具體如下: A 類: |0| + 網(wǎng)絡(luò)號(hào)7位+主機(jī)號(hào)24位 -55 B 類: |1 0|+網(wǎng)絡(luò)號(hào)14位+主機(jī)號(hào)16位 -
4、55 C 類: |1 1 0|+網(wǎng)絡(luò)號(hào)21位+主機(jī)號(hào)8位 -55 D 類: |1 1 1 0|+網(wǎng)絡(luò)號(hào)28位多播組號(hào) -55 E 類: |1 1 1 1 0|+27位留待后用 在使用IP地址進(jìn)行通信時(shí),可分為單播、組播和廣播三種通信方式。單播即網(wǎng)絡(luò)節(jié)點(diǎn)之間進(jìn)行點(diǎn)到點(diǎn)的通信;組播,又稱多播,常用于視頻會(huì)議,由一個(gè)節(jié)點(diǎn)向指定的一組節(jié)點(diǎn)逐個(gè)發(fā)送數(shù)據(jù),多播使用D類IP地址。廣播類似組播,只是它不區(qū)分子網(wǎng)中的節(jié)點(diǎn),也就是對(duì)所有節(jié)點(diǎn)發(fā)送數(shù)據(jù),因此占用整個(gè)網(wǎng)絡(luò)帶寬,廣播使用固定的IP” 25
5、55”。1.3、軟件系統(tǒng)結(jié)構(gòu)C/S(Client/Server)結(jié)構(gòu),即大家熟知的客戶機(jī)和服務(wù)器結(jié)構(gòu),根據(jù)實(shí)際情況對(duì)服務(wù)器和客戶端進(jìn)行合理的分配任務(wù),一方面可以減少網(wǎng)絡(luò)通信的開銷,另一方面降低了服務(wù)器的壓力,在這種結(jié)構(gòu)下,客戶端相對(duì)獨(dú)立地分擔(dān)了一些任務(wù),使其功能豐富,換個(gè)角度也稱這樣的客戶端為胖客戶端。B/S(Browser/Server)結(jié)構(gòu)即瀏覽器和服務(wù)器結(jié)構(gòu)。它是隨著Internet技術(shù)的興起,對(duì)C/S結(jié)構(gòu)的一種變化或者改進(jìn)的結(jié)構(gòu)。在這種結(jié)構(gòu)下,主要事務(wù)邏輯在服務(wù)器端(Server)實(shí)現(xiàn),用戶通過WWW瀏覽器獲取需要的服務(wù),因極少部分事務(wù)邏輯在前端(Browser)
6、實(shí)現(xiàn),因此也可稱為瘦客戶端。在工控領(lǐng)域,一二級(jí)控制系統(tǒng)因?yàn)閷?duì)系統(tǒng)實(shí)時(shí)性要求較高,一般都采用C/S結(jié)構(gòu),而高層的信息管理系統(tǒng)大多采用B/S結(jié)構(gòu)。二、SOCKET編程2.1、SOCKET概述SOCKET是在TCP/IP協(xié)議下進(jìn)行網(wǎng)絡(luò)編程的接口,在編寫網(wǎng)絡(luò)軟件時(shí),用戶不用關(guān)系底層協(xié)議是如何實(shí)現(xiàn)的,SOCKET提供了一些API使網(wǎng)絡(luò)編程變得相對(duì)簡(jiǎn)單。SOCKET是由伯克利大學(xué)分校設(shè)計(jì),最早主要用于在UNIX進(jìn)行網(wǎng)絡(luò)開發(fā),微軟在此基礎(chǔ)上對(duì)其進(jìn)行擴(kuò)展,稱其為WinSocket,擴(kuò)展的socket API一般都以WSA開頭,在windows上進(jìn)行網(wǎng)絡(luò)編程,基本的socket函數(shù)和擴(kuò)展的socket函數(shù)都可以
7、使用。2.2、同步(阻塞)/異步(非阻塞)同步是指計(jì)算機(jī)的IO操作不能同時(shí)進(jìn)行,也就是計(jì)算機(jī)系統(tǒng)內(nèi)核在進(jìn)行IO操作時(shí),線程處于等待狀態(tài)(阻塞),在內(nèi)核完成IO操作后,等待的線程才繼續(xù)執(zhí)行。異步是相對(duì)于同步而言,線程在向系統(tǒng)內(nèi)核提出IO操作請(qǐng)求后繼續(xù)執(zhí)行,線程通過內(nèi)核定義的信號(hào)狀態(tài)判斷IO操作是否完成。同步IO操作相對(duì)簡(jiǎn)單,但異步IO會(huì)使整個(gè)軟件有更高的性能,但開發(fā)難度較大。2.3、基本開發(fā)步驟TCPUDP三、網(wǎng)絡(luò)IO模型Winsock提供了五種 IO模型:選擇(Select)、異步選擇(WSAAsyncSelect)、事件選擇(WSAEventSelect)、重疊I/O(Overlapped
8、I/O)和完成端口(Completion Port)共五種I/O模型。每種模型都有各自的特點(diǎn),應(yīng)用程序應(yīng)根據(jù)實(shí)際需要選擇合適的IO模型。1. 選擇模型之所以叫做“選擇”模型,是因?yàn)樵撃P鸵詓elect函數(shù)為核心,該模型最初主要是面向UNIX操作系統(tǒng),使用該模型可以避免程序阻塞或在非阻塞模式下IO操作返回錯(cuò)誤。如果你選擇的是同步socket,讀寫操作會(huì)被阻塞,這可以通過多線程來解決,但是如果有多個(gè)socket需要進(jìn)行讀寫,使用多線程的方法就十分有限了。選擇異步socket不會(huì)阻塞,但在socket不可操作時(shí)進(jìn)行讀寫會(huì)返回錯(cuò)誤,而且也不知何時(shí)socket才能可以讀寫,輪詢的方式又會(huì)降低程序的性能,
9、使用select則可以解決這樣的問題。在這個(gè)模型中,你可以通過select函數(shù)選擇你所關(guān)心的socket,select會(huì)為你監(jiān)聽你所關(guān)心的socket的狀態(tài),直到這些socket可以操作select才返回。下面給出一個(gè)典型的選擇模型開發(fā)步驟:2. 異步選擇模型在這個(gè)模型中,應(yīng)用程序可以在socket上接收以windows消息為基礎(chǔ)的網(wǎng)絡(luò)事件通知,根據(jù)通知內(nèi)容進(jìn)行執(zhí)行相應(yīng)的動(dòng)作,如果你在開發(fā)一個(gè)界面應(yīng)用程序,希望處理網(wǎng)絡(luò)事件像處理一般的消息一樣,選擇這個(gè)模型就非常合適。這個(gè)模型中的關(guān)鍵函數(shù)為WSAAsyncSelect,原型如下:int WSAAsyncSelect ( SOCKET s, /你
10、所關(guān)注的socket句柄 HWND hWnd, /用于接收socket消息的窗口句柄 unsigned int wMsg, /一個(gè)你自己定義的消息,網(wǎng)絡(luò)事件以此消息通知 long lEvent /網(wǎng)絡(luò)事件掩碼);這個(gè)函數(shù)將socket和窗口通過消息建立關(guān)聯(lián),在socket上有事件發(fā)生時(shí),系統(tǒng)會(huì)將該函數(shù)指定的消息發(fā)送給該函數(shù)所指定窗口,然后系統(tǒng)再調(diào)用窗口過程處理該消息。在窗口收到的消息中,wParam 就是socket句柄 ,lParam代表網(wǎng)絡(luò)事件和錯(cuò)誤代碼,window提供兩個(gè)宏:WSAGETSELECTERROR(lParam) 提取錯(cuò)誤代碼,通過WSAGetLastError可以獲得錯(cuò)誤
11、信息;WSAGETSELECTEVENT(lParam)提取網(wǎng)絡(luò)事件,網(wǎng)絡(luò)事件常用的有FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT|FD_CONNECTION等,這樣我們收到一個(gè)socket消息后,就知道了在哪個(gè)socket上發(fā)生了什么事件。3. 事件選擇模型異步選擇模型以處理窗口消息的方式處理網(wǎng)絡(luò)事件,對(duì)于開發(fā)窗口程序比較方便,而對(duì)于一個(gè)沒有窗口的程序則需要建立一個(gè)隱藏窗口。針對(duì)異步選擇模型的不足,WinSocket提供了事件選擇模型,該模型與異步選擇模型類似,只不過它是基于內(nèi)核事件而異步選擇模型基于窗口。我們通過WSAEventSelect將socket與內(nèi)核事件
12、建立關(guān)聯(lián),原型如下:int WSAEventSelect ( SOCKET s, /socket WSAEVENT hEventObject, /內(nèi)核事件 long lNetworkEvents /網(wǎng)絡(luò)事件);WinSocket對(duì)內(nèi)核事件進(jìn)行了封裝,如將CreateEvent 封裝為WSACreateEvent,將HANDLE封裝為WSAEVENT,兩者使用方法類似。WSAEVENT 與EVENT一樣有兩種狀態(tài):有信號(hào)、無信號(hào),等待事件信號(hào)的方法也類似,普遍的EVENT使用WaitForMultipleObjects,而等待WSAEVENT信號(hào)使用WSAWaitForMultipleEvent
13、s,原型如下:DWORD WSAWaitForMultipleEvents( DWORD cEvents, /第二個(gè)參數(shù)WSAEVENT 的總數(shù) const WSAEVENT FAR *lphEvents, / WSAEVENT指針,通過數(shù)組傳入多個(gè) BOOL fWaitAll, /是否等待全部事件都有信號(hào)才返回 DWORD dwTimeOUT, /超時(shí) BOOL fAlertable /在該模型中不用,固定設(shè)為FALSE);如何知道是哪個(gè)socket發(fā)生事件?用WSAWaitForMultipleEvents的返回值減去WSA_WAIT_EVENT_0就是第二個(gè)參數(shù)lphEvents指向的數(shù)
14、組標(biāo)號(hào),為此要將保存的socket句柄數(shù)組和事件數(shù)組一一對(duì)應(yīng),知道數(shù)組標(biāo)號(hào),也就知道了發(fā)生事件的socket。知道了哪個(gè)socket,如何知道在這個(gè)socket上發(fā)生了什么事件?通過函數(shù)WSAEnumNetworkEvents 可以獲得,原型如下:int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );前兩個(gè)參數(shù)我們已經(jīng)知道,第三個(gè)參數(shù)為WSANETWORKEVENTS的結(jié)構(gòu)體指針,該結(jié)構(gòu)體定義如下:typedef struct _WSANETWORKEVE
15、NTS long lNetworkEvents;/事件代碼 int iErrorCodeFD_MAX_EVENTS;/錯(cuò)誤代碼 WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;將事件與“求與”如FD_READ, 如果結(jié)果非零,則說明該事件發(fā)生了if (FD_READ & tNetEvents.lNetworkEvents)/ 收到數(shù)據(jù)if (0 != tNetEvents.iErrorCodeFD_READ_BIT) /錯(cuò)誤代碼 4. 重疊IO模型與之前的IO模型相比,重疊IO模型具有較高的讀寫效率,在投遞一個(gè)IO操作后,系統(tǒng)直接操作應(yīng)用程序中的緩
16、沖區(qū),而不是先操作socket緩沖區(qū)之后再拷貝到應(yīng)用程序的緩沖區(qū)。該模型效率高,但使用上也比較復(fù)雜,比較適合實(shí)時(shí)數(shù)據(jù)采集或者在傳輸大的文件時(shí)應(yīng)用,大致開發(fā)步驟如下:1)創(chuàng)建一個(gè)套接字,開始在指定的端口上監(jiān)聽連接請(qǐng)求。2)接受一個(gè)進(jìn)入的連接請(qǐng)求。3)為接受的套接字新建一個(gè)WSAOVERLAPPED結(jié)構(gòu),并為該結(jié)構(gòu)分配一個(gè)事件對(duì)象句柄。也將事件對(duì)象句柄分配給一個(gè)事件數(shù)組,以便稍后由WSAWaitForMultipleEvents函數(shù)使用。4)在套接字上投遞一個(gè)異步WSARecv請(qǐng)求,指定參數(shù)為WSAOVERLAPPED結(jié)構(gòu)。5)使用步驟3)的事件數(shù)組,調(diào)用WSAWaitForMultipleEve
17、nts函數(shù),并等待與重疊調(diào)用關(guān)聯(lián)在一起的事件進(jìn)入"已傳信"狀態(tài)6)WSAWaitForMultipleEvents函數(shù)完成后,事件數(shù)組,調(diào)用WSAResetEvent函數(shù),從而重設(shè)事件對(duì)象,并對(duì)完成的重疊請(qǐng)求進(jìn)行處理.7)使用WSAGetOverlappedResult函數(shù),判斷重疊調(diào)用的返回狀態(tài)是什么.8)在套接字上投遞另一個(gè)重疊WSARecv請(qǐng)求.9)重復(fù)步驟58.5.完成端口模型完成端口模型據(jù)稱是目前效率最高也最復(fù)雜的模型,但它只適用于NT和2000系統(tǒng),在一個(gè)應(yīng)用程序需要與大量的客戶端連接時(shí),比較適合使用此模型,如開發(fā)游戲服務(wù)器。它的主要思想是將眾多的socket映
18、射到一個(gè)叫完成端口的對(duì)象上,通過這個(gè)完成端口來管理與客戶端的通信。在創(chuàng)建這個(gè)完成端口時(shí)需要指定CPU數(shù)量,根據(jù)CPU數(shù)量建立相應(yīng)的線程,CPU數(shù)量越大,應(yīng)用程序運(yùn)行效率越高。四、基于MFC的socket編程1、CAsyncSocket這個(gè)類實(shí)際上是對(duì)socket異步選擇模型的封裝,在建立一個(gè)CAsyncSocket對(duì)象后,它內(nèi)部創(chuàng)建了一個(gè)隱藏的CSocketWnd窗口,該窗口根據(jù)收到的消息類型調(diào)用CAsyncSocket定義虛函數(shù),這樣我們只需要重載這些虛函數(shù)完成所需要的操作即可。 OnAccept 通知偵聽套接字,它可以通過調(diào)用Accept,接受掛起連接請(qǐng)求 OnClose 通知套接字,關(guān)閉對(duì)它的套接字連接 OnConnect 通知連接套接字,連接嘗試已經(jīng)完成,無論成功或失敗 OnOutOfBandData 通知接收套接字,在套接字上有帶外數(shù)據(jù)讀入,通常是忙消息 OnReceive 通知偵聽套接字,通過調(diào)用Receive恢復(fù)數(shù)據(jù) OnSend
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理教案設(shè)計(jì)試題及答案
- 安全生產(chǎn)管理外語(yǔ)文獻(xiàn)的試題及答案
- 2025年建造師復(fù)習(xí)方法試題及答案
- 施工現(xiàn)場(chǎng)生態(tài)環(huán)境管理試題及答案
- 英語(yǔ)教學(xué)課件Module 10 A holiday journey Unit 1 What did you do
- 消防設(shè)計(jì)中的圖紙審核試題及答案
- 外語(yǔ)考試備考與復(fù)習(xí)策略研究試題及答案
- 一級(jí)建造師備考要點(diǎn)回顧試題及答案
- 強(qiáng)化訓(xùn)練中級(jí)會(huì)計(jì)試題及答案
- 方向引領(lǐng)2025年入團(tuán)考試試題及答案
- 礦山地質(zhì)災(zāi)害危險(xiǎn)性評(píng)估要點(diǎn)
- 泰勒斯威夫特英文介紹演示文稿
- 超星爾雅學(xué)習(xí)通《帶您走進(jìn)西藏》章節(jié)測(cè)試答案
- 施工監(jiān)理投標(biāo)報(bào)價(jià)單
- 陽(yáng)江海上風(fēng)電項(xiàng)目建議書
- 大學(xué)本科畢業(yè)設(shè)計(jì)畢業(yè)論文-網(wǎng)上藥店管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- DBJ∕T 13-264-2017 福建省石砌體結(jié)構(gòu)加固技術(shù)規(guī)程
- 洞口縣黃橋鎮(zhèn)污水處理廠入河排污口設(shè)置論證報(bào)告
- T∕CGMA 081001-2018 整體式高速齒輪傳動(dòng)裝置通用技術(shù)規(guī)范
- 核事故現(xiàn)場(chǎng)處置中的洗消問題
- FeNO測(cè)定及應(yīng)用
評(píng)論
0/150
提交評(píng)論