手游開發(fā)第三階段-3次課057-windows高效通信模型_第1頁
手游開發(fā)第三階段-3次課057-windows高效通信模型_第2頁
手游開發(fā)第三階段-3次課057-windows高效通信模型_第3頁
手游開發(fā)第三階段-3次課057-windows高效通信模型_第4頁
手游開發(fā)第三階段-3次課057-windows高效通信模型_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

網(wǎng)絡(luò)游戲開發(fā)-高級應(yīng)用第8章Windows高效通信模型第8章Windows高效通信模型WSAAsynSelect模型WSAEventSelect模型WSAAsynSelect模型同步與異步的概念熟練使用WSAAsynSelect模型了解WSAEventSelect模型第8章Windows高效通信模型8.1異步通信模型8.1.1Socket事件“同步”是指應(yīng)用程序的網(wǎng)絡(luò)請求和操作保持對應(yīng)關(guān)系,操作完成后,投遞請求的函數(shù)調(diào)用返回?!爱惒健敝笐?yīng)用程序調(diào)用函數(shù)投遞請求時,函數(shù)不在操作完成后返回,而是投遞請求后立刻返回。網(wǎng)絡(luò)傳輸服務(wù)提供者通過某種方式返回結(jié)果。第8章Windows高效通信模型8.1異步通信模型8.1.1Socket事件當(dāng)Client端socket與Server端socket相互通信時,兩端均會觸發(fā)socket事件。事件含義FD_READ程序想要接收有關(guān)是否可讀的通知,以便讀入數(shù)據(jù)FD_WRITE程序想要接收有關(guān)是否可寫的通知,以便寫入數(shù)據(jù)FD_OOB程序想要接收是否有OOB數(shù)據(jù)到達(dá)的通知FD_ACCEPT程序想要接收與進(jìn)入連接有關(guān)的通知FD_CONNECT程序想要接收與一次連接或多點(diǎn)接入有關(guān)的通知FD_CLOSE程序想要接收與套接字關(guān)閉有關(guān)的通知FD_QOS程序想要接收套接字“服務(wù)質(zhì)量(QoS)”發(fā)生變化的通知FD_GROUP_QOS暫時沒用,屬于保留事件FD_ROUTING_INTERFACE_CHANGE程序想要接收有關(guān)到指定地址的路由接口發(fā)生變化的通知FD_ADDRESS_LIST_CHANGE程序想要接收本地地址變化的通知第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型WSAAsynSelect即WinSock異步選擇模型,它是使用Windows消息通知網(wǎng)絡(luò)事件的異步機(jī)制。1.WSAAsynSelect函數(shù)intWSAAsyncSelect(SOCKETs, //檢查的套接字HWNDhWnd, //接收消息的窗口句柄unsignedintuMsg, //發(fā)生網(wǎng)絡(luò)事件時要接收的消息longlEvent //網(wǎng)絡(luò)事件);#defineWM_SOCKETWM_USER+1第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型wParam參數(shù)指定在其上面發(fā)生了一個網(wǎng)絡(luò)事件的套接字,如果定義了多個套接字,這個參數(shù)就顯得很重要了。lParam參數(shù)則包含了兩方面的重要信息,它的低位字指定了已經(jīng)發(fā)生的網(wǎng)絡(luò)事件,而高位字包含了可能出現(xiàn)的錯誤代碼。1.WSAAsynSelect函數(shù)LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage, WPARAMwParam,

LPARAMlParam)第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型1)檢測lParam的高位字節(jié),判斷是否在套接字上面發(fā)生了網(wǎng)絡(luò)錯誤。使用WSAGETSELECTERROR宏返回高字節(jié)包含的錯誤信息。2)如果沒有發(fā)現(xiàn)任何的錯誤,確定究竟是什么類型的網(wǎng)絡(luò)事件觸發(fā)了這條Windows消息,使用WSAGETSELECTEVENT宏來返回網(wǎng)絡(luò)事件類型。2.模型原理3.服務(wù)器實(shí)現(xiàn)使用WSAAsyncSelect異步通信模型時,應(yīng)用程序被動地接收通知,再對Socket進(jìn)行相應(yīng)的處理。第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam, LPARAMlParam){ intwmId,wmEvent; PAINTSTRUCTps; HDChdc;

switch(message) { caseWM_CREATE: WSACleanup(); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { MessageBox(hWnd,"StartSocketFailed","info",MB_OK); break; }第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型 if((Listen=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET) { MessageBox(hWnd,"SocketFailed","info",MB_OK); break; } WSAAsyncSelect(Listen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE); InternetAddr.sin_family=AF_INET; InternetAddr.sin_addr.s_addr=inet_addr("127.0.0.1");

InternetAddr.sin_port=htons(PORT); if(bind(Listen,(PSOCKADDR)&InternetAddr, sizeof(InternetAddr))==SOCKET_ERROR) { MessageBox(hWnd,"BindFailed","info",MB_OK); break; } if(listen(Listen,5))

{ MessageBox(hWnd,"ListenFailed","info",MB_OK); break; } break;第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型caseWM_SOCKET:if(WSAGETSELECTERROR(lParam)){ MessageBox(hWnd,"WSAError","info",MB_OK); FreeSocketInformation(wParam);}else{ switch(WSAGETSELECTEVENT(lParam)) { caseFD_ACCEPT: if((Accept=accept(Listen,NULL,NULL))==INVALID_SOCKET) { MessageBox(hWnd,"ErrorAccept","info",MB_OK); break; } else CreateSocketInformation(Accept,hWnd); WSAAsyncSelect(Accept,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE); break;第8章Windows高效通信模型8.1異步通信模型8.1.2WSAAsynSelect模型caseFD_READ:SocketInfo=GetSocketInformation(wParam);if(SocketInfo){if(SocketInfo->BytesRECV!=0){SocketInfo->RecvPosted=TRUE;break;}else{SocketInfo->DataBuf.buf=SocketInfo->Buffer; SocketInfo->DataBuf.len=DATA_BUFSIZE;recv(SocketInfo->Socket,SocketInfo->Buffer,DATA_BUFSIZE,0); MessageBox(hWnd,SocketInfo->Buffer,"服務(wù)端收到",MB_OK); SocketInfo->BytesRECV=RecvBytes; send(SocketInfo->Socket,"SendbyServer!",15,0);}} break;caseFD_CLOSE: FreeSocketInformation(wParam); break;}……第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理WSAEventSelect模型是另一種Winsock異步I/O模型。接收以事件為基礎(chǔ)的網(wǎng)絡(luò)事件通知。把事件傳遞給窗口進(jìn)程,而是投遞至一個事件對象句柄。1.事件通知要求應(yīng)用程序?yàn)槊總€套接字創(chuàng)建一個事件對象:WSAEVENTWSACreateEvent(void);intWSAEventSelect(SOCKETs, //關(guān)聯(lián)的套接字WSAEventhEventObject, //關(guān)聯(lián)的事件句柄longlNetworkEvents); //事件類型將它與某個套接字關(guān)聯(lián):第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理工作狀態(tài)“已傳信”(signaled)和“未傳信”(nonsignaled)。工作模式“人工重設(shè)”(manualreset)和“自動重設(shè)”(autoreset)。狀態(tài)轉(zhuǎn)換WSACreateEvent最開始在一種未傳信的工作狀態(tài)中。網(wǎng)絡(luò)事件觸發(fā)事件對象,工作狀態(tài)便會從“未傳信”轉(zhuǎn)變成“已傳信”完成處理之后,應(yīng)用程序需要將工作狀態(tài)從已傳信更改為未傳信。WSAResetEvent(WSAEVENThEvent);BOOLWSACloseEvent(WSAEVENThEvent);關(guān)閉事件對象第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理2.I/O處理DWORDWSAWaitForMultipleEvents(DWORDcEvents, //事件對象數(shù)量

constWSAEVENTFAR*lphEvents, //時間對象數(shù)組BOOLfWaitAll, DWORDdwTimeOUT,BOOLfAlertable);等待網(wǎng)絡(luò)事件觸發(fā)事件對象句柄的工作狀態(tài):cEvents和lphEvents參數(shù)定義了由WSAEVENT對象構(gòu)成的一個數(shù)組;數(shù)組大小為:WSA_MAXIMUM_WAIT_EVENTS;WSAWaitForMultipleEvents一次最多都只能支持64個套接字;那么如何處理大于64個連接的應(yīng)用呢?(使用多線程)第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理2.I/O處理fWaitAll指定了WSAWaitForMultipleEvents如何等待在事件數(shù)組中的對象。TRUE,只有數(shù)組內(nèi)包含的所有事件對象都已進(jìn)入已傳信狀態(tài),函數(shù)才會返回。FALSE,任何一個事件對象進(jìn)入已傳信狀態(tài),函數(shù)就會返回。dwTimeout參數(shù)規(guī)定了最長等待時間(毫秒)。超過規(guī)定的時間,函數(shù)就會立即返回。如超時值為0,函數(shù)會檢測指定的事件對象的狀態(tài),并立即返回??紤]到性能,應(yīng)盡量避免將超時值設(shè)為0。如果為WSA_INFINITE則表示無限等待直到事件發(fā)生。fAlertable可以忽略的,且應(yīng)設(shè)為FALSE。第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理2.I/O處理Index=WSAWaitForMultipleEvents(…);MyEvent=EventArr[Index-WSA_WAIT_EVENT_0];intWSAEnumNetworkEvents(SOCKETs,WSAEVENThEventObject,LPWSANETWORKEVENTSlpNetworkEvents);調(diào)查發(fā)生了什么類型的網(wǎng)絡(luò)事件:s網(wǎng)絡(luò)事件的套接字;hEventObject參數(shù)則是可選的,它指定了一個事件句柄,對應(yīng)于打算重設(shè)的那個事件對象??蓪⑺鼈魅?,令其自動成為“未傳信”狀態(tài);lpNetworkEvents,指向WSANETWORKEVENTS結(jié)構(gòu),用于接收套接字上發(fā)生的網(wǎng)絡(luò)事件類型以及可能出現(xiàn)的任何錯誤代碼;第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理2.I/O處理typedefstruct_WSANETWORKEVENTS{longlNetworkEvents;intiErrorCode[FD_MAX_EVENTS];}WSANETWORKEVENTS,FAR*LPWSANETWORKEVENTS;lNetworkEvents參數(shù)指定了一個值,對應(yīng)于套接字上發(fā)生的所有網(wǎng)絡(luò)事件類型注意一個事件進(jìn)入傳信狀態(tài)時,可能會同時發(fā)生多個網(wǎng)絡(luò)事件類型。例如,一個繁忙的服務(wù)器應(yīng)用可能同時收到FD_READ和FD_WRITE通知。iErrorCode參數(shù)指定的是一個錯誤代碼數(shù)組,同lNetworkEvents中的事件關(guān)聯(lián)在一起。第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理2.I/O處理 WaitForSingleObject(gEvent,INFINITE); WSAEnumNetworkEvents(sockConnection,gEvent,&events); if(events.lNetworkEvents&FD_READ) { if(events.iErrorCode[FD_READ_BIT]!=0) { printf("FD_READError!\n"); break; } recv(sockConnection,DataBuffer,sizeof(DataBuffer),0); printf("[recv]%s\n",DataBuffer); }第8章Windows高效通信模型8.1異步通信模型8.1.3WSAEventSelect模型原理2.I/O處理typedefstruct_WSANETWORKEVENTS{longlNetworkEvents;intiErrorCode[FD_MAX_EVENTS];}WSANETWORKEVENTS,FAR*LPWSANETWORKEVENTS;lNetworkEvents參數(shù)指定了一個值,對應(yīng)于套接字上發(fā)生的所有網(wǎng)絡(luò)事件類型注意一個事件進(jìn)入傳信狀態(tài)時,可能會同時發(fā)生多個網(wǎng)絡(luò)事件類型。例如,一個繁忙的服務(wù)器應(yīng)用可能同時收到FD_READ和FD_WRITE通知。iErrorCode參數(shù)指定的是一個錯誤代碼數(shù)組,同lNetworkEvents中的事件關(guān)聯(lián)在一起。事件索引,名字與事件類型的名字類似:FD_READ對應(yīng)于FD_READ_BIT。第8章Windows高效通信模型小結(jié)(理論課)本章主要介紹了兩種異步通信基本原理:WSAAsynSelect模型WSAEventSelect模型第8章Windows高效通信模型小測驗(yàn)(題目部分)多選題1.關(guān)于WSAAsynSelect的說法錯誤的是(

)。A.WSAAsynSelect使用Windows消息機(jī)制B.WSAAsynSelect的消息類型為WM_SOCK,這是系統(tǒng)定義的消息類型C.WSAAsynSelect模型可以選擇感興趣的幾種事件D

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論