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

本文共 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://ajama.baihongyu.com/

你可能感兴趣的文章
安卓中高级开发面试知识点之——缓存
查看>>
Java的初始化顺序
查看>>
js 判断回文字符串
查看>>
shields小徽章是如何生成的?以及搭建自己的shield服务器
查看>>
猫头鹰的深夜翻译:spring事务管理
查看>>
记一次使用Spring REST Docs + travis + github自动生成API接口文档的操作步骤(下)...
查看>>
1、集合 2、Iterator迭代器 3、增强for循环 4、泛型
查看>>
关于/var/run/docker.sock
查看>>
SCrapy爬虫大战京东商城
查看>>
用 JavaScript 实现链表操作 - 11 Alternating Split
查看>>
Laravel优秀扩展包整理
查看>>
日志分析之识别真假蜘蛛与处理办法
查看>>
回顾小程序2018年三足鼎立历程,2019年BAT火力全开
查看>>
太多脚本将会毁掉持续交付
查看>>
一地鸡毛 OR 绝地反击,2019年区块链发展指南
查看>>
C# 8新提案让泛型Attribute成为现实
查看>>
ASP.NET Core:简洁的力量
查看>>
关于AWS的Firecracker,技术人应该知道的十件事
查看>>
卢森堡大学发布RepuCoin系统,可破解区块链51%攻击
查看>>
国内云计算厂商众生相:四大阵营十几家企业生存盘点
查看>>