課件及代碼061-windows高效通信模型_第1頁
課件及代碼061-windows高效通信模型_第2頁
課件及代碼061-windows高效通信模型_第3頁
課件及代碼061-windows高效通信模型_第4頁
課件及代碼061-windows高效通信模型_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

網(wǎng)絡(luò)游戲開發(fā)-高級應(yīng)用第8章Windows高效通信模型第8章Windows高效通信模型完成端口技術(shù)完成端口基本概念掌握完成端口技術(shù)IOCP工作者線程重疊端口第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念I(lǐng)OCP是IOCompletePort的縮寫,即完成端口。在WindowsNT或Windows2000以上版本的操作系統(tǒng)上,要為大量套接字IO請求提供服務(wù),完成端口模型是最佳選擇。1.IOCP基本原理什么是完成端口完成端口是應(yīng)用程序使用多線程技術(shù)處理異步IO請求的一種機制。完成端口如何工作完成端口可以和多個IO對象關(guān)聯(lián),然后讓一個或多個線程在完成端口上等待IO操作結(jié)果的到來,這樣它們才能被處理。除了可以接受套接字以外,還可以接受文件、作業(yè)等的通知。完成端口中的“端口”和網(wǎng)絡(luò)協(xié)議中的“端口”不是一類概念,也不是某種硬件接口。需要強調(diào)的是,它主要用于處理異步I/O請求。第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念I(lǐng)OCP模型主要用于服務(wù)器的設(shè)計??蚣艿牧鞒蹋海?)初始化WinSock;(2)創(chuàng)建一個完成端口;(3)根據(jù)服務(wù)器CPU數(shù)創(chuàng)建一定量的工作者線程,用于處理網(wǎng)絡(luò)消息;(4)準(zhǔn)備好一個socket進行bind然后listen;(5)進入循環(huán)accept等待客戶請求;(6)創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu)容納socket和其他相關(guān)信息;(7)將新連接的socket同完成端口相關(guān)聯(lián);(8)投遞一個準(zhǔn)備接受的請求。然后重復(fù)步驟5~8的過程。1.IOCP基本原理第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念完成端口特點異步套接字模型當(dāng)網(wǎng)絡(luò)事件發(fā)生時才進行收發(fā)操作。完成端口時投遞網(wǎng)絡(luò)請求的Socket函數(shù)要在事件發(fā)生前調(diào)用。數(shù)據(jù)接收:當(dāng)接收操作完成后,數(shù)據(jù)被拷貝到緩沖區(qū),工作者線程得到通知,應(yīng)用程序可以直接處理這些數(shù)據(jù)。1.IOCP基本原理工作者線程第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念1.IOCP基本原理ClientClientpletionPort監(jiān)聽線程邏輯處理函數(shù)任務(wù)隊列Client…Send()第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念2.工作者線程與完成端口完成端口的關(guān)鍵步驟:1)完成端口的創(chuàng)建和句柄的關(guān)聯(lián)。2)工作者線程對事件的處理。工作者線程,就是進行網(wǎng)絡(luò)消息處理的線程。工作者線程反復(fù)查詢完成端口,并將數(shù)據(jù)包存儲到緩沖區(qū)中,或直接解析、處理。第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念2.工作者線程與完成端口創(chuàng)建和關(guān)聯(lián)完成端口都使用pletionPort。HANDLEpletionPort(HANDLEFileHandle, //和IOCP關(guān)聯(lián)的文件句柄HANDLEpletionPort, //IOCP句柄DWORDCompletionKey, //逐句柄的完成鍵DWORDNumberOfConcurrentThreads //并發(fā)線程數(shù)量);FileHandle是要進行異步操作的IO對象句柄,如果取值為INVALID_HANDLE_VALUE,那么將會創(chuàng)建一個完成端口對象,這時pletionPort也必須為NULL,CompletionKey將會被忽略。第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念2.工作者線程與完成端口NumberOfConcurrentThreads,指定了并發(fā)線程數(shù)量。每個工作者線程都會使用pletionStatus等待IO操作的完成,一旦有IO操作完成,函數(shù)就返回,線程被喚醒。如果實際創(chuàng)建的線程數(shù)量超過這個數(shù)字,那么超出數(shù)量的線程將不會被喚醒。線程最大個數(shù)的經(jīng)驗公式為:線程數(shù)

=

CPU數(shù)

*

2第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念3.完成端口與重疊端口重疊原理:讓應(yīng)用程序使用一個重疊的數(shù)據(jù)結(jié)構(gòu),一次投遞一個或多個WinsockI/O請求。針對提交的收發(fā)數(shù)據(jù)的請求,在它們完成之后,應(yīng)用程序可為這些請求提供服務(wù)。模型的總體設(shè)計以Win32重疊I/O機制為基礎(chǔ)。調(diào)用時需要指定WSAOVERLAPPED結(jié)構(gòu)(可選),每個結(jié)構(gòu)對應(yīng)一個數(shù)據(jù)收發(fā)和連接的接受。如果調(diào)用這些函數(shù)時,使用一個WSAOVERLAPPED結(jié)構(gòu),函數(shù)會立即完成并返回,不管套接字是否設(shè)為阻塞模式。第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念3.完成端口與重疊端口typedefstruct_WSAOVERLAPPED{DWORDInternal; //保留(系統(tǒng)使用)DWORDInternalHigh; //保留DWORDOffset; //保留DWORDOffsetHigh; //保留WSAEVENThEvent;}WSAOVERLAPPED,FAR*LPWSAOVERLAPPED;當(dāng)連接數(shù)量很多時,管理“完成”事件的方法:1)等待“事件對象通知”(WSAEventSelect模型類似)2)可通過“完成例程”(一個函數(shù)),對已經(jīng)完成的請求加以處理管理數(shù)量不是太多(≤64)連接數(shù)量龐大完成端口第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念3.完成端口與重疊端口intWSASend(SOCKETs,LPWSABUFlpBuffers, //緩沖區(qū)DWORDdwBufferCount,LPDWORDlpNumberOfBytesSent, //要發(fā)送的數(shù)據(jù)的字節(jié)數(shù)DWORDdwFlags, //調(diào)用的方式,一般取0LPWSAOVERLAPPEDlpOverlapped,//重疊結(jié)構(gòu),一般指向一個IO數(shù)據(jù)體PLETION_ROUTINEpletionROUTINE//回調(diào)函數(shù),一般為0);typedefstruct__WSABUF{u_longlen; //緩沖區(qū)長度charFAR*buf; //緩沖區(qū)首地址}WSABUF,FAR*LPWSABUF;WSABUF只是描述了一個緩沖區(qū),內(nèi)部并不包含要收發(fā)的數(shù)據(jù)。第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念3.完成端口與重疊端口//IO數(shù)據(jù),用于重疊端口typedefstructtagOPERATIONDATA{ OVERLAPPEDOverlapped; //重疊結(jié)構(gòu)體 WSABUFDataBuf; //緩沖區(qū),長度和地址 CHARBuffer[DATA_BUFFERSIZE]; //緩沖區(qū)內(nèi)存 DWORDBytesSEND; DWORDBytesRECV; WORDuOP;}PER_IO_OPERATION_DATA,*LPPER_IO_OPERATION_DATA;lpOverlapped一般指向一個IO數(shù)據(jù)體:intWSARecv(SOCKETs,LPWSABUFlpBuffers,DWORDdwBufferCount, LPDWORDlpNumberOfBytesRecvd,LPDWORDlpFlags, LPWSAOVERLAPPEDlpOverlapped, PLETION_ROUTINEpletionROUTINE);每次接收完畢后就該再投遞一個請求:第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念3.完成端口與重疊端口BOOLpletionStatus(HANDLECompletionPort, //完成端口句柄LPDWORDlpNumberOfBytesTransferred,//接收已傳輸字節(jié)數(shù)的變量LPDWORDpletionKey, //完成鍵(在關(guān)聯(lián)時指定)LPOVERLAPPED*lpOverlapped, //接收重疊結(jié)構(gòu)(投遞請求時指定)指針的變量DWORDdwMilliseconds //可選的超時時間);工作者線程調(diào)用pletionStatus函數(shù),控制權(quán)交給系統(tǒng),當(dāng)沒有I/O操作完成的信息時,該函數(shù)一直等待,線程處于休眠狀態(tài)。工作者線程調(diào)用pletionStatus函數(shù),控制權(quán)交給系統(tǒng),當(dāng)沒有I/O操作完成的信息時,該函數(shù)一直等待,線程處于休眠狀態(tài)。第8章Windows高效通信模型8.2IOCP8.2.1IOCP基本概念4.線程的安全退出BOOLpletionStatus(CompletionPort, &BytesTransferred,(LPDWORD)&PerHandleData, (LPOVERLAPPED*)&PerIoData,100);if(PerIoData==NULL&&result!=0) break; //結(jié)束線程內(nèi)主循環(huán)pletionStatus函數(shù),可以用于發(fā)送一個自定義的包含了OVERLAPPED成員變量的結(jié)構(gòu)地址。結(jié)構(gòu)包含一個狀態(tài)變量,當(dāng)狀態(tài)變量為退出標(biāo)志時,線程就可以執(zhí)行清除動作然后退出。pletionStatus(CompletionPort,0,0,0);關(guān)閉方法:第8章Windows高效通信模型8.2IOCP8.2.2實現(xiàn)IOCP服務(wù)器if((Accept=WSAAccept(Listen,NULL,NULL,NULL,0))==SOCKET_ERROR){ //套接字已經(jīng)被關(guān)閉,退出線程 printf("WSAAccept()failedwitherror%d\n“,WSAGetLastError()); return0;}//創(chuàng)建單句柄數(shù)據(jù)if((PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL){ printf("GlobalAlloc()failedwitherror%d\n“,GetLastError()); return1;}PerHandleData->Socket=Accept;gListHandles.push_back(PerHandleData); //添加到列表//將一個Accept端口與已經(jīng)創(chuàng)建好的的完成端口CompletionPort關(guān)聯(lián)起來if(pletionPort((HANDLE)Accept,CompletionPort,(DWORD)PerHandleData,0)==NULL){ printf("pletionPortfailedwitherror%d\n“,GetLastError()); return1;}第8章Windows高效通信模型8.2IOCP8.2.2實現(xiàn)IOCP服務(wù)器 //創(chuàng)建單IO數(shù)據(jù)并初始化 if((PerIoData=(LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)))==NULL) { printf("GlobalAlloc()failedwitherror%d\n“,GetLastError()); return1; } ZeroMemory(&(PerIoData->Overlapped),sizeof(OVERLAPPED)); PerIoData->BytesSEND=0; PerIoData->BytesRECV=0; PerIoData->DataBuf.len=DATA_BUFFERSIZE; PerIoData->DataBuf.buf=PerIoData->Buffer; PerIoData->uOP=OP_READ; Flags=0; //投遞一個接收數(shù)據(jù)的請求 if(WSARecv(Accept,&(PerIoData->DataBuf),1,&RecvBytes,&Flags, &(PerIoData->Overlapped),NULL)==SOCKET_ERROR) { if(WSAGetLastError()!=ERROR_IO_PENDING) return1; }第8章Windows高效通信模型小結(jié)本章主要介紹了大規(guī)模網(wǎng)絡(luò)應(yīng)用中的編程技術(shù):完成端口技術(shù)第8章Windows高效通信模型小測驗(題目部分)單選題1.以下屬于ACE_Event_Handler類的直接或間接派生類的是()。A.ACE_Task B.ACE_Reactor C.ACE_Message_Queue D.Pool_Thread2.ACE中實現(xiàn)跨平臺性能的模塊是()。A.OS適配層 B.C++包裝界面 C.框架類 D.分布式應(yīng)用層多選題3.簡述通常情況下,關(guān)于IOCP模型說法正確的是()。A.IOCP技術(shù)不只用于管理套接字B.使用IOCP時,當(dāng)套接字上有數(shù)據(jù)到來時,就可以調(diào)用recv函數(shù)了C.IOCP是一種算法,可以應(yīng)用在Linux平臺下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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論