CIOCP自定義幫助函數

                                                 1 客戶鏈接列表                                                               異步

m_pConnectionList指向客戶鏈接列表,描述全部鏈接的CIOCPContext對象組成的表函數

AddAConnnection函數向列表中加入一個CIOCPContext對象。若是到達最大數量返回FALSEspa

CloseAConnnection函數關閉指定的客戶鏈接code

CloseAllConnection函數遍歷整個鏈接列表,關閉全部的客戶套接字對象

                       2 拋出接收請求的列表                blog

全部未決的accept請求都在m_pPendingAccepts指向的列表中it

InsertPendingAccept函數將一個IO緩衝區對象插入到m_pPendingAccepts表中io

RemovePendingAccept函數遍歷這個表,從中移除指定的緩衝區對象class

                3 序列化讀操做                      List

爲保證異步讀操做投遞順序完成,爲每一個鏈接投遞讀請求分配一個序列號。

pOutOfOederReads列表中的元素是按照其序列號從小到大的順序排列的

GetNextReadBuffer函數:

  以客戶上下文   和   讀操做完成緩衝區對象  爲參數,以正確的順序返回這個客戶發送的下一個緩衝區對象

主要函數代碼:

CIOCPBuffer *CIOCPServer::GetNextReadBuffer(CIOCPContext *pContext,CIOCPBuffer *pBuffer) { if(pBuffer !=NULL) { if(pBuffer->nSequenceNumber == pContext->nCurrentReadSequence) return pBuffer; pBuffer->pNext = NULL; CIOCPBuffer *ptr = pContext->pOutOfOrderReads; CIOCPBuffer *pPre = NULL; while(ptr!=NULL) { if(pBuffer->nSequenceNumber < ptr->nSequenceNumber) break; pPre = ptr; ptr = ptr->pNext; } if(pPre == NULL) { pBuffer->pNext = pContext->pOutOfOrderReads; pContext->pOutOfOrderReads = pBuffer; } else { pBuffer->pNext = pPre->pNext; pPre->pNext = pBuffer; } } CIOCPBuffer *ptr = pContext->pOutOfOrderReads; if(ptr!=NULL &&(ptr->nSequenceNumber == pContext->nCurrentReadSequence)) { pContext->pOutOfOrderReads = ptr->pNext; return ptr; } return NULL }

                4  投遞重疊IO                      

PostAccept   PostSend   PostRecv函數分別用於在套接字上投遞AcceptIO  SendIO   RecvIO

PostRecv代碼比其餘兩個多了一個投遞序列號..其餘的都差很少,代碼以下:

BOOL CIOCPServer::PostRecv(CIOCPContext *pContext,CIOCPBuffer *pBuffer) { pBuffer->nOperation = OP_READ; ::EnterCriticalSection(&pContext->Lock); pBuffer->nSequenceNumber = pContext->nSequenceNumber; DWORD dwBytes; DWORD dwFlags= 0; WSABUF buf; buf.buf = pBuffer->buff; buf.len = pBuffer->nLen; if(::WSARecv(pContext->s,&buf,1,&dwBtytes,&dwFlags,&pBuffer->ol,NULL)!=NO_ERROR) { ::LeaveCriticalSection(&pContext->Lock); return FALSE; } pContext->nOutstandingRecv++; pContext->nReadSequence++; ::LeaveCriticalSection(&pContext->Lock); return TRUE; }
相關文章
相關標籤/搜索