版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《Proteus仿真平臺單片機(jī)項(xiàng)目式教程》課件 項(xiàng)目9 簡易電子琴
- 2024年市區(qū)國有企業(yè)合作協(xié)議書范文
- 氣溫驟變做好防范現(xiàn)在的病癥很混雜多加辨別
- 7天雙方無責(zé)任試崗期協(xié)議書范文
- 掌握文學(xué)作品背后的歷史背景
- 含可燃冰沉積物合成及分解試驗(yàn)規(guī)范-編寫說明
- 公司級安全培訓(xùn)試題含答案【培優(yōu)A卷】
- 廠里職工安全培訓(xùn)試題及答案【各地真題】
- 班組三級安全培訓(xùn)試題及答案【奪冠系列】
- 項(xiàng)目部安全培訓(xùn)試題答案可打印
- DL-T 5117-2021水下不分散混凝土試驗(yàn)規(guī)程-PDF解密
- 傭金協(xié)議中英文范本
- 產(chǎn)品設(shè)計風(fēng)險管理計劃書
- 《認(rèn)識方向》(教案)青島版二年級上冊數(shù)學(xué)
- KA-T 21-2024 模袋法尾礦堆壩技術(shù)規(guī)程
- 《軍事理論》教案第五章 信息化裝備
- 數(shù)字PCR技術(shù)原理及應(yīng)用
- 食材配送服務(wù)配送方案
- (高清版)TDT 1067-2021 不動產(chǎn)登記數(shù)據(jù)整合建庫技術(shù)規(guī)范
- 臨床醫(yī)療安全工作培訓(xùn)課件
- 統(tǒng)編(部編)高中語文必修上冊寫作訓(xùn)練題(解析)
評論
0/150
提交評論