Winsocket編程基礎_第1頁
Winsocket編程基礎_第2頁
Winsocket編程基礎_第3頁
Winsocket編程基礎_第4頁
Winsocket編程基礎_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一、網(wǎng)絡編程基礎1.1計算機網(wǎng)絡概述計算機網(wǎng)絡把分布在不同地點且具有獨立功能的多個計算機系統(tǒng)通過通信設備和線路連接起來,在功能完善的軟件和協(xié)議的管理下實現(xiàn)網(wǎng)絡中資源共享。在工控領域,現(xiàn)場數(shù)據(jù)的采集、傳輸及控制信息的發(fā)送都依賴于計算機網(wǎng)絡來實現(xiàn)。1.2、網(wǎng)絡參考模型為什么要對網(wǎng)絡進行分層設計?在計算機通信過程中需要通信協(xié)議,但因傳輸介質的不同、計算機本身的差異以及數(shù)據(jù)格式的不同等因素,致使網(wǎng)絡通信相當復雜,為了降低復雜性,OSI提出了協(xié)議分層的參考模型,即OSI七層互聯(lián)參考模型。因為OSI的網(wǎng)絡模型標準比較嚴格,另外推出的時間也相對較晚,所以目前還沒有完全按照OSI模型實現(xiàn)的網(wǎng)絡。TCP/IP是

2、目前實際應用最廣泛的一種網(wǎng)絡模型,在這個模型中,不只是劃分了功能層,還有具體的實現(xiàn)技術,即協(xié)議。TCP和IP就是這個模型中最重要的兩個層次的代表協(xié)議。 1.2.1、OSI和TCP/IP參考模型在網(wǎng)絡的不同分層中有不同的協(xié)議,計算機只能在同一層次上進行通信,如下圖:雖然TCP/IP不是完全符合OSI的參考模型,但在層次上也存在著對應關系,如下圖:1.2.2、數(shù)據(jù)流向在網(wǎng)絡的層次模型中,每一層與相鄰層之間都留有接口,較低層通過接口為上一層提供服務,中間層就像個翻譯一樣,如下圖為經(jīng)典的中德教師的對話過程:在TCP/IP網(wǎng)絡模型中,數(shù)據(jù)在從應用層向網(wǎng)絡接口層(鏈路層)傳遞的過程中,每經(jīng)過一層都要加入該

3、層的相應的協(xié)議內容,這樣數(shù)據(jù)在鏈路層形成了完整的數(shù)據(jù)包,該數(shù)據(jù)包到達接收方后,數(shù)據(jù)包從鏈路層到應用層進行逐層解析,在接收方應用層解析得到的數(shù)據(jù)就是發(fā)送方在應用層發(fā)送的數(shù)據(jù),數(shù)據(jù)進行逐層封裝和解析的過程如下圖:1.2.3、IP分類IP地址在網(wǎng)絡層中定義,長度為32個二進制位,分為4段,每段8位,用于主機在網(wǎng)絡中的標識,IP地址有兩部分組成,一部分為網(wǎng)絡地址,另一部分為主機地址。IP地址分為A、B、C、D、E 共5類,具體如下: A 類: |0| + 網(wǎng)絡號7位+主機號24位 -55 B 類: |1 0|+網(wǎng)絡號14位+主機號16位 -

4、55 C 類: |1 1 0|+網(wǎng)絡號21位+主機號8位 -55 D 類: |1 1 1 0|+網(wǎng)絡號28位多播組號 -55 E 類: |1 1 1 1 0|+27位留待后用 在使用IP地址進行通信時,可分為單播、組播和廣播三種通信方式。單播即網(wǎng)絡節(jié)點之間進行點到點的通信;組播,又稱多播,常用于視頻會議,由一個節(jié)點向指定的一組節(jié)點逐個發(fā)送數(shù)據(jù),多播使用D類IP地址。廣播類似組播,只是它不區(qū)分子網(wǎng)中的節(jié)點,也就是對所有節(jié)點發(fā)送數(shù)據(jù),因此占用整個網(wǎng)絡帶寬,廣播使用固定的IP” 25

5、55”。1.3、軟件系統(tǒng)結構C/S(Client/Server)結構,即大家熟知的客戶機和服務器結構,根據(jù)實際情況對服務器和客戶端進行合理的分配任務,一方面可以減少網(wǎng)絡通信的開銷,另一方面降低了服務器的壓力,在這種結構下,客戶端相對獨立地分擔了一些任務,使其功能豐富,換個角度也稱這樣的客戶端為胖客戶端。B/S(Browser/Server)結構即瀏覽器和服務器結構。它是隨著Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種結構下,主要事務邏輯在服務器端(Server)實現(xiàn),用戶通過WWW瀏覽器獲取需要的服務,因極少部分事務邏輯在前端(Browser)

6、實現(xiàn),因此也可稱為瘦客戶端。在工控領域,一二級控制系統(tǒng)因為對系統(tǒng)實時性要求較高,一般都采用C/S結構,而高層的信息管理系統(tǒng)大多采用B/S結構。二、SOCKET編程2.1、SOCKET概述SOCKET是在TCP/IP協(xié)議下進行網(wǎng)絡編程的接口,在編寫網(wǎng)絡軟件時,用戶不用關系底層協(xié)議是如何實現(xiàn)的,SOCKET提供了一些API使網(wǎng)絡編程變得相對簡單。SOCKET是由伯克利大學分校設計,最早主要用于在UNIX進行網(wǎng)絡開發(fā),微軟在此基礎上對其進行擴展,稱其為WinSocket,擴展的socket API一般都以WSA開頭,在windows上進行網(wǎng)絡編程,基本的socket函數(shù)和擴展的socket函數(shù)都可以

7、使用。2.2、同步(阻塞)/異步(非阻塞)同步是指計算機的IO操作不能同時進行,也就是計算機系統(tǒng)內核在進行IO操作時,線程處于等待狀態(tài)(阻塞),在內核完成IO操作后,等待的線程才繼續(xù)執(zhí)行。異步是相對于同步而言,線程在向系統(tǒng)內核提出IO操作請求后繼續(xù)執(zhí)行,線程通過內核定義的信號狀態(tài)判斷IO操作是否完成。同步IO操作相對簡單,但異步IO會使整個軟件有更高的性能,但開發(fā)難度較大。2.3、基本開發(fā)步驟TCPUDP三、網(wǎng)絡IO模型Winsock提供了五種 IO模型:選擇(Select)、異步選擇(WSAAsyncSelect)、事件選擇(WSAEventSelect)、重疊I/O(Overlapped

8、I/O)和完成端口(Completion Port)共五種I/O模型。每種模型都有各自的特點,應用程序應根據(jù)實際需要選擇合適的IO模型。1. 選擇模型之所以叫做“選擇”模型,是因為該模型以select函數(shù)為核心,該模型最初主要是面向UNIX操作系統(tǒng),使用該模型可以避免程序阻塞或在非阻塞模式下IO操作返回錯誤。如果你選擇的是同步socket,讀寫操作會被阻塞,這可以通過多線程來解決,但是如果有多個socket需要進行讀寫,使用多線程的方法就十分有限了。選擇異步socket不會阻塞,但在socket不可操作時進行讀寫會返回錯誤,而且也不知何時socket才能可以讀寫,輪詢的方式又會降低程序的性能,

9、使用select則可以解決這樣的問題。在這個模型中,你可以通過select函數(shù)選擇你所關心的socket,select會為你監(jiān)聽你所關心的socket的狀態(tài),直到這些socket可以操作select才返回。下面給出一個典型的選擇模型開發(fā)步驟:2. 異步選擇模型在這個模型中,應用程序可以在socket上接收以windows消息為基礎的網(wǎng)絡事件通知,根據(jù)通知內容進行執(zhí)行相應的動作,如果你在開發(fā)一個界面應用程序,希望處理網(wǎng)絡事件像處理一般的消息一樣,選擇這個模型就非常合適。這個模型中的關鍵函數(shù)為WSAAsyncSelect,原型如下:int WSAAsyncSelect ( SOCKET s, /你

10、所關注的socket句柄 HWND hWnd, /用于接收socket消息的窗口句柄 unsigned int wMsg, /一個你自己定義的消息,網(wǎng)絡事件以此消息通知 long lEvent /網(wǎng)絡事件掩碼);這個函數(shù)將socket和窗口通過消息建立關聯(lián),在socket上有事件發(fā)生時,系統(tǒng)會將該函數(shù)指定的消息發(fā)送給該函數(shù)所指定窗口,然后系統(tǒng)再調用窗口過程處理該消息。在窗口收到的消息中,wParam 就是socket句柄 ,lParam代表網(wǎng)絡事件和錯誤代碼,window提供兩個宏:WSAGETSELECTERROR(lParam) 提取錯誤代碼,通過WSAGetLastError可以獲得錯誤

11、信息;WSAGETSELECTEVENT(lParam)提取網(wǎng)絡事件,網(wǎng)絡事件常用的有FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT|FD_CONNECTION等,這樣我們收到一個socket消息后,就知道了在哪個socket上發(fā)生了什么事件。3. 事件選擇模型異步選擇模型以處理窗口消息的方式處理網(wǎng)絡事件,對于開發(fā)窗口程序比較方便,而對于一個沒有窗口的程序則需要建立一個隱藏窗口。針對異步選擇模型的不足,WinSocket提供了事件選擇模型,該模型與異步選擇模型類似,只不過它是基于內核事件而異步選擇模型基于窗口。我們通過WSAEventSelect將socket與內核事件

12、建立關聯(lián),原型如下:int WSAEventSelect ( SOCKET s, /socket WSAEVENT hEventObject, /內核事件 long lNetworkEvents /網(wǎng)絡事件);WinSocket對內核事件進行了封裝,如將CreateEvent 封裝為WSACreateEvent,將HANDLE封裝為WSAEVENT,兩者使用方法類似。WSAEVENT 與EVENT一樣有兩種狀態(tài):有信號、無信號,等待事件信號的方法也類似,普遍的EVENT使用WaitForMultipleObjects,而等待WSAEVENT信號使用WSAWaitForMultipleEvent

13、s,原型如下:DWORD WSAWaitForMultipleEvents( DWORD cEvents, /第二個參數(shù)WSAEVENT 的總數(shù) const WSAEVENT FAR *lphEvents, / WSAEVENT指針,通過數(shù)組傳入多個 BOOL fWaitAll, /是否等待全部事件都有信號才返回 DWORD dwTimeOUT, /超時 BOOL fAlertable /在該模型中不用,固定設為FALSE);如何知道是哪個socket發(fā)生事件?用WSAWaitForMultipleEvents的返回值減去WSA_WAIT_EVENT_0就是第二個參數(shù)lphEvents指向的數(shù)

14、組標號,為此要將保存的socket句柄數(shù)組和事件數(shù)組一一對應,知道數(shù)組標號,也就知道了發(fā)生事件的socket。知道了哪個socket,如何知道在這個socket上發(fā)生了什么事件?通過函數(shù)WSAEnumNetworkEvents 可以獲得,原型如下:int WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );前兩個參數(shù)我們已經(jīng)知道,第三個參數(shù)為WSANETWORKEVENTS的結構體指針,該結構體定義如下:typedef struct _WSANETWORKEVE

15、NTS long lNetworkEvents;/事件代碼 int iErrorCodeFD_MAX_EVENTS;/錯誤代碼 WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;將事件與“求與”如FD_READ, 如果結果非零,則說明該事件發(fā)生了if (FD_READ & tNetEvents.lNetworkEvents)/ 收到數(shù)據(jù)if (0 != tNetEvents.iErrorCodeFD_READ_BIT) /錯誤代碼 4. 重疊IO模型與之前的IO模型相比,重疊IO模型具有較高的讀寫效率,在投遞一個IO操作后,系統(tǒng)直接操作應用程序中的緩

16、沖區(qū),而不是先操作socket緩沖區(qū)之后再拷貝到應用程序的緩沖區(qū)。該模型效率高,但使用上也比較復雜,比較適合實時數(shù)據(jù)采集或者在傳輸大的文件時應用,大致開發(fā)步驟如下:1)創(chuàng)建一個套接字,開始在指定的端口上監(jiān)聽連接請求。2)接受一個進入的連接請求。3)為接受的套接字新建一個WSAOVERLAPPED結構,并為該結構分配一個事件對象句柄。也將事件對象句柄分配給一個事件數(shù)組,以便稍后由WSAWaitForMultipleEvents函數(shù)使用。4)在套接字上投遞一個異步WSARecv請求,指定參數(shù)為WSAOVERLAPPED結構。5)使用步驟3)的事件數(shù)組,調用WSAWaitForMultipleEve

17、nts函數(shù),并等待與重疊調用關聯(lián)在一起的事件進入"已傳信"狀態(tài)6)WSAWaitForMultipleEvents函數(shù)完成后,事件數(shù)組,調用WSAResetEvent函數(shù),從而重設事件對象,并對完成的重疊請求進行處理.7)使用WSAGetOverlappedResult函數(shù),判斷重疊調用的返回狀態(tài)是什么.8)在套接字上投遞另一個重疊WSARecv請求.9)重復步驟58.5.完成端口模型完成端口模型據(jù)稱是目前效率最高也最復雜的模型,但它只適用于NT和2000系統(tǒng),在一個應用程序需要與大量的客戶端連接時,比較適合使用此模型,如開發(fā)游戲服務器。它的主要思想是將眾多的socket映

18、射到一個叫完成端口的對象上,通過這個完成端口來管理與客戶端的通信。在創(chuàng)建這個完成端口時需要指定CPU數(shù)量,根據(jù)CPU數(shù)量建立相應的線程,CPU數(shù)量越大,應用程序運行效率越高。四、基于MFC的socket編程1、CAsyncSocket這個類實際上是對socket異步選擇模型的封裝,在建立一個CAsyncSocket對象后,它內部創(chuàng)建了一個隱藏的CSocketWnd窗口,該窗口根據(jù)收到的消息類型調用CAsyncSocket定義虛函數(shù),這樣我們只需要重載這些虛函數(shù)完成所需要的操作即可。 OnAccept 通知偵聽套接字,它可以通過調用Accept,接受掛起連接請求 OnClose 通知套接字,關閉對它的套接字連接 OnConnect 通知連接套接字,連接嘗試已經(jīng)完成,無論成功或失敗 OnOutOfBandData 通知接收套接字,在套接字上有帶外數(shù)據(jù)讀入,通常是忙消息 OnReceive 通知偵聽套接字,通過調用Receive恢復數(shù)據(jù) OnSend

溫馨提示

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

評論

0/150

提交評論