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;
}
- 移动端UC /QQ 浏览器的部分私有Meta 属性
- RelativeLayout(相对布局)
- TableLayout(表格布局)
- 【MindiaX实例】 PHP 在foreach 中获取JSON 单个数据
- 史上十大最严重黑客袭击事件盘点
- LinearLayout(线性布局)
- 服务化了,没想到耦合更加严重?
- 利用好注册的域名
- Android中TextView
- 腾讯 DCI 上线基于集中控制的 SR-TE 方案
- 如何从VS2003升级到VS2008
- js中多个Date对象变量间赋值互相影响
- 并发编程之Executor,Executors,ExecutorService和ThreadPoolExecutor
- 【DeveMobile实例】d3.js 与Trianglify 制作SVG格式Low-Poly 特效
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 简单说维特比算法 - python实现
- Android绘图及Bitmap几个知识点整理
- Spark Pipeline官方文档
- Python-时间及日期-07-获取本周或上周几具体日期
- Spark Job-Stage-Task实例理解
- 想查看微信好友撤回的消息?Python帮你搞定
- MySQL 案例:同步中断与SQL线程类型转换
- Android端Charles抓包
- Spring boot 启动提示数据源错误
- leetcode树之从上到下打印二叉树
- 整理C/C++的可变参数
- ThingJS结合Web地图API开发,让数据展示更加出色!
- 如何分析交易记录?
- [技术创作101训练营]小程序云开发实战:从零搭建科技爱好者周刊小程序
- 【技术创作101训练营】innerHTML插入运行js字符串问题探究