unit_listenerthread.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Unit_ListenerThread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//Listen thread executant,for acceptor blocking
//监听(Accept)线程执行体,用来接受用户连接请求
//
//参数:
//lpParam:用户数据,完成端口管理类
unsigned WINAPI ListenerThread(LPVOID lpParam)
{
SOCKET sockAccept;
LPCONN_CTX lpConnCtx;
int nResult;
unsigned Result=0;//线程返回值
//还原参数
TtcpIOCP *pIOCPServer=(TtcpIOCP *)lpParam;
try
{
if(!pIOCPServer)//参数错误
{
Result=1;
}
if(!pIOCPServer->IOCPInvalid)
{//完成例程前置条件初始化失败/未成功
pIOCPServer->FRunningState=LS_SHUTDN;
Result=2;
}
if(INVALID_SOCKET==pIOCPServer->ListenSock)
{//监听Socket创建失败,或未创建成功
pIOCPServer->FRunningState=LS_SHUTDN;
Result=3;
}
//服务器预置状态为非关闭状态,并且前置参数全部正常则运行
while((pIOCPServer->TuningListenState>LS_SHUTDN)
&&(Result==0)
&&(pIOCPServer->FListenSock!=INVALID_SOCKET))
{
struct sockaddr_in RemoteAddr;
memset(&RemoteAddr,0,sizeof(sockaddr));
int AddrLen=sizeof(sockaddr);
//置服务实际运行状态为预期状态
pIOCPServer->FRunningState=pIOCPServer->TuningListenState;
//如果为工作态,则执行Accept阻塞
if(LS_WORK==pIOCPServer->TuningListenState)
{
//Accept阻塞,用来接受一个用户连接
sockAccept=accept(pIOCPServer->ListenSock,
(struct sockaddr FAR*)&RemoteAddr,
&AddrLen);
if(sockAccept==INVALID_SOCKET)
{
//网络错误
pIOCPServer->FRunningState=LS_SHUTDN;
Result=4;
break;
}
if(LS_WORK==pIOCPServer->TuningListenState)
{
bool bAccepted=true;
try
{
//发出OnAccept通知,同时取判决结果
//若被执行策略,则bAccepted为返回false
//则直接断开该连接
pIOCPServer->InternalOnAccept(ntohs(RemoteAddr.sin_port),
inet_ntoa(RemoteAddr.sin_addr),
bAccepted);
}
catch(...)
{
}
if(bAccepted)
{
//连接正常接受,则添加一个用户连接信息上下文
pIOCPServer->AddConnection(sockAccept,
ntohs(RemoteAddr.sin_port),
inet_ntoa(RemoteAddr.sin_addr));
}
else
{
//被执行策略,强制关闭连接
ForceCloseSocket(sockAccept,true);
}
}
}
}
}
__finally
{
if(pIOCPServer)
{
//置服务状态为关闭态,同时重置期望值
pIOCPServer->FRunningState=LS_SHUTDN;
pIOCPServer->FTuningListenState=pIOCPServer->FRunningState;
}
//结束线程
_endthreadex(Result);
}
//形式返回值
return Result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -