CIOCP自定义帮助函数
1 客户连接列表
m_pConnectionList指向客户连接列表,描述所有连接的CIOCPContext对象组成的表
AddAConnnection函数向列表中加入一个CIOCPContext对象。如果到达最大数量返回FALSE
CloseAConnnection函数关闭指定的客户连接
CloseAllConnection函数遍历整个连接列表,关闭所有的客户套接字
2 抛出接收请求的列表
所有未决的accept请求都在m_pPendingAccepts指向的列表中
InsertPendingAccept函数将一个IO缓冲区对象插入到m_pPendingAccepts表中
RemovePendingAccept函数遍历这个表,从中移除指定的缓冲区对象
3 序列化读操作
为保证异步读操作投递顺序完成,为每个连接投递读请求分配一个序列号。
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?