//---------------------------------------------------------------------------
#pragma hdrstop
#include "Unit_WorkerThread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//worker thread executant,for all I/O C.P. workers
//完成端口例程线程执行体
//参数
//lpParam:用户数据,完成端口类指针
unsigned WINAPI WorkerThread(LPVOID lpParam)
{
unsigned Result; //线程返回值
TtcpIOCP *tcpIOCP;//完成端口管理器类指针
HANDLE hIOCP; //完成端口句柄
DWORD InternalThreadID;//当前线程ID
LPIODATA OutData; //数据元素链式结构体指针
DWORD dwIOSize; //完成例程提交数据长度值
LPOVERLAPPEDEX lpPerIOData;//重叠I/O信息扩展结构体指针
LPOVERLAPPED pOverLapped;//重叠I/O信息原始结构体指针
LPCONN_CTX lpConnCtx;//用户连接上下文结构体指针
DWORD LastError; //最后一次线程内OS级错误代码
DWORD Socket_Error;//最后一次线程内网络级(Socket)错误代码
bool bSuccess; //完成例成队列是否弹出
int nResult; //网络作业提交返回值
bool Should_Break;
#ifdef __DEBUG
DWORD PreThreadId;
#endif
Result=0;//预置线程返回值(Exit Code)
tcpIOCP=(TtcpIOCP *)lpParam;//将参数还原成原始类型
hIOCP=tcpIOCP->Handle;//取得完成端口例程句柄
InternalThreadID=GetCurrentThreadId();//取得当前线程的ID号
while(1)
{
////////////////////////////////////////////////////////////
//判断当前同步运行之线程数量是否超出用户预期运行之线程数量//
//如果超出该期望值,则判断是否有2个以上线程处于用户数据守 //
//候状态,如果有足够线程等待新的完成例程事件,则结束线程 //
// //
//值得注意的是: //
// 1.完成例程通知线程是使用LIFO的顺序, //
// 也就是最近(后)进入待的线程将得到最大的优先运行权 //
// 主要是考虑到当一个线程长时间不工作时对于操作系统 //
// 则须将分配给该线程的资源转换到磁盘缓冲当中出 //
// 从而提高物理内存的利用率,以预期达到最优的运行效果//
// 2.对于网络(包括所有关联于该完成例程的I/O事件都采用 //
// FIFO的顺序,用以保证数据的顺序性和有效性 //
////////////////////////////////////////////////////////////
if((tcpIOCP->ThreadCount>tcpIOCP->FExpectThreadCount)&&
(tcpIOCP->FActiveThreadCount>2))
{
//将线程置入线程顺收站
//以便让时脉处理例程完成对相关资源的回收,以及关闭相关句柄
tcpIOCP->DumpThread(InternalThreadID);
//结束线程循环,终结线程
break;
}
//Active Queued Thread Signal
//增加活动{实际为等待完成例程队列)计数
InterlockedIncrement(&(tcpIOCP->FActiveThreadCount));
//加入完成端口例程处理线程队列,以等待完成例程事件/讯号
dwIOSize=0;
lpConnCtx=NULL;
pOverLapped=NULL;
lpPerIOData=NULL;
OutData=NULL;
bSuccess=GetQueuedCompletionStatus(hIOCP,
&dwIOSize,
(LPDWORD)&lpConnCtx,
&pOverLapped,
INFINITE);
//Inactive Queued Thread Signal
//得到一个完成例程讯号,线程从等待队列中出列
//减少活动{实际为等待完成例程队列)计数
InterlockedDecrement(&(tcpIOCP->FActiveThreadCount));
//No more thread waiting for completion
//and in working State
//and Thread count is lower than the Max count
//Increment One Thread
//为保证至少有一个线程处于等待完成例程的处理线程的队列当中
//将在最大线程的限制范围内,增加实际工作线程
//该值可能会超出用户预期同步运行线程数
//if((1>(tcpIOCP->FActiveThreadCount))
/* if((tcpIOCP->ExpectThreadCount>(tcpIOCP->ThreadCount))
&&(tcpIOCP->ThreadCount<(long)MAX_THREAD_NUMBER)
&&(tcpIOCP->FRunningState>LS_SHUTDN))
{
tcpIOCP->AddThread();
}*/
//Terminate thread by PostQueuedCompletionStatus
//线程结束通知,由PostQueuedCompletionStatus发出
//并使得参数lpCompletionKey为NULL
if(lpConnCtx==NULL)
{
break;
}
//取得重叠I/O信息扩展结构体(从原型指针当中还原)
lpPerIOData=(LPOVERLAPPEDEX)(pOverLapped);
pOverLapped=NULL;
//当一个得到一个完成通知
//并且传输数据量为0表示客户端正常断开
if(bSuccess&&(dwIOSize==0))
{
//减少未决操作引用计数
//该计数主要是为了免除时脉例程处理回收站数据时
//在所有事件完成/取消前将相关的资源释放掉
//而导致MSWINSOCK.DLL内部内存地址访问非法错误
InterlockedDecrement(&(lpPerIOData->LockCount));
//将该连接上下文信息节点移入回收站
//以供资源回收例程进一步处理
lpPerIOData=NULL;
tcpIOCP->DumpConnection(lpConnCtx);
//继续处理下一个完成端口通知事件
continue;
}
//完成端口未通知相关事件
//则可能是由部分线程自我数量调控
//而自行终结导致在该线程提交的I/O请求被取消
//或者网络异常
if(!bSuccess)
{
/*Here should Print the InternalThreadID
and Previous InternalThread in OVERLAPPEDEX*/
//取得最近错误代码
LastError=GetLastError();
Socket_Error=WSAGetLastError();
if(NULL==lpPerIOData)
{
//SetLastError(0);
continue;
}
/*if( LastError!=ERROR_IO_PENDING
//重叠 I/O 操作在进行中。
//Overlapped I/O operation is in progress.
&&LastError!=ERROR_OPERATION_ABORTED
//由于线程退出或应用程序请求,已放弃 I/O 操作。
//The I/O operation has been aborted because of either a thread exit or an application request.
&&LastError!=ERROR_NETNAME_DELETED
//指定的网络名不存在
//The specified network name is no longer available.
&&LastError!=ERROR_INVALID_PARAMETER
//参数不正确
//The parameter is incorrect.
)*/
switch(LastError)
{
case ERROR_OPERATION_ABORTED:
#ifdef __DEBUG
/*if(lpPerIOData->WorkingThreadID!=InternalThreadID)
{
WSASetLastError(0);
SetLastError(0);
break;
}*/
#endif
case ERROR_NETNAME_DELETED://指定的网络名不再可用。
case ERROR_INVALID_PARAMETER://参数不正确。
//完成通知队列未弹出不能减少未决操作引用计数
//该计数主要是为了免除时脉例程处理回收站数据时
//在所有事件完成/取消前将相关的资源释放掉
//而导致MSWINSOCK.DLL内部内存地址访问非法错误
//将该连接上下文信息节点移入回收站
//以供资源回收例程进一步处理
default:
#ifdef __ERRORLOG
{
char *Msg;
Msg=(char *) AllocEx(256);
//memset(Msg,0,256);
strcpy(Msg,"ThrdID:");
ltoa(InternalThreadID,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|SocketError:");
ltoa(Socket_Error,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|ThreadError:");
ltoa(LastError,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|I/O Size:");
ltoa(dwIOSize,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|SOCKET:");
itoa(lpConnCtx->sockAccept,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|Oper:");
itoa(lpPerIOData->oper,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|LockCount:");
ltoa(lpPerIOData->LockCount,(char *)(&Msg[0]+strlen(Msg)),10);
strcat(Msg,"|PreThrdID:");
ltoa(lpPerIOData->WorkingThreadID,(char *)(&Msg[0]+strlen(Msg)),10
没有合适的资源?快使用搜索试试~ 我知道了~
iocp.rar_IOCP_VC IOCP_bcb iocp_iocp框架有哪些
共29个文件
cpp:12个
h:11个
bpr:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 48 浏览量
2022-09-19
14:54:58
上传
评论
收藏 39KB RAR 举报
温馨提示
IOCP是一种高性能的网络编程框架,在面对大的服务压力的时候,用传统的accept来维持连接处理事务,服务效率会严重变低,系统主要用来维护上下文切换了.所以用IOCP来实现网络功能,类似于java里的连接池功能,让连接来排队等候处理.例子代码可用bcb调试,因为里面没有bcb的选项,只能选VC了.
资源推荐
资源详情
资源评论
收起资源包目录
iocp.rar (29个子文件)
iocp高性能网络框架
NetWork_Utility.cpp 6KB
Test.bdsproj.local 115B
IOCP_Class.cpp 20KB
Unit_ListenerThread.h 253B
Test_Main.h 2KB
Unit_Connections.cpp 22KB
Unit_PurifierThread.h 253B
Test_Main.cpp 3KB
Unit_InternalDataProcess.cpp 2KB
Unit_WorkerThread.h 249B
Test_Main.ddp 51B
Test.bdsproj 21KB
Test.res 4KB
Test_Main.dfm 4KB
Unit_MessageUtility.h 420B
Test.bpr 7KB
Unit_WorkerThread.cpp 27KB
Unit_PurifierThread.cpp 5KB
Unit_Threads.cpp 4KB
Unit_Connections.h 247B
Unit_Threads.h 239B
Unit_MessageUtility.cpp 248B
Test.cpp 809B
NetWork_Utility.h 2KB
Unit_PurifierTimer.cpp 2KB
Unit_ListenerThread.cpp 3KB
IOCP_Class.h 20KB
Unit_PurifierTimer.h 251B
Unit_InternalDataProcess.h 263B
共 29 条
- 1
资源评论
局外狗
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- apache-maven-3.6.1-bin.zip
- c593f5fc-d4a7-4b43-8ab2-51afc90f3f62
- IIR滤波器参数计算函数
- WPF树菜单拖拽功能,下级目录拖到上级目录,上级目录拖到下级目录.zip
- CDH6.3.2版本hive2.1.1修复HIVE-14706后的jar包
- 鸿蒙项目实战-天气项目(当前城市天气、温度、湿度,24h天气,未来七天天气预报,生活指数,城市选择等)
- Linux环境下oracle数据库服务器配置中文最新版本
- Linux操作系统中Oracle11g数据库安装步骤详细图解中文最新版本
- SMA中心接触件插合力量(插入力及分离力)仿真
- 变色龙记事本,有NPP功能,JSONview功能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功