博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CIOCP自定义帮助函数
阅读量:6581 次
发布时间:2019-06-24

本文共 2306 字,大约阅读时间需要 7 分钟。

                                                 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;}

转载地址:http://zbino.baihongyu.com/

你可能感兴趣的文章
ios硬件编码
查看>>
【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
查看>>
【转】Oracle索引的类型
查看>>
ActiveMQ使用示例之Topic
查看>>
FragmentTransaction.replace() 你不知道的坑
查看>>
分布式消息队列 Kafka
查看>>
模拟退火算法
查看>>
Solr 按照得分score跟指定字段相乘排序
查看>>
Mybatis特殊值Enum类型转换器-ValuedEnumTypeHandler
查看>>
java.lang.IllegalArgumentException: Request header is too large
查看>>
fastDFS 命令笔记
查看>>
C# Uditor 富文本的部署
查看>>
Python strip()方法
查看>>
Jmeter接口自动化测试 (四)(持续构建)
查看>>
微信小程序 事件
查看>>
管理带有子模块的git库[转]
查看>>
VNC黑屏解决办法
查看>>
一个屌丝程序猿的人生(五十)
查看>>
elasticsearch2.x插件之一:kopf
查看>>
程序员们,再不行动就来不及了!
查看>>