📄 unit_purifierthread.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Unit_PurifierThread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
unsigned WINAPI PurifierThread(LPVOID lpParam)
{
unsigned Result; //线程返回值
TtcpIOCP *tcpIOCP;//完成端口管理器类指针
//HANDLE hIOCP; //完成端口句柄
LPCONN_CTX Connection;
HANDLE ThreadHandle;
Result=0;
try
{
tcpIOCP=(TtcpIOCP*)lpParam;
//hIOCP=tcpIOCP->Handle;
while(true)
{
DWORD WaitResult=WaitForMultipleObjects(2,tcpIOCP->EventArray,false,INFINITE);
if(WaitResult==1)
{
break;
}
if(WaitResult!=0)
continue;
/*预进入用户连接临界区,对相关死连接及超时连接做检测*/
if(TryEnterCriticalSection(&(tcpIOCP->conn_CriticalSection)))
{
try
{
for(int Index=tcpIOCP->FConnectionList.size()-1;Index>=0;Index--)
{
Connection=tcpIOCP->FConnectionList.at(Index);
DWORD Connect_Time;
int Size=sizeof(DWORD);
/*sockAccept==INVALID_SOCKET 为死连接*/
/*getsocketopt,so_connect_time取该连接的连接时间*/
if((Connection->sockAccept!=INVALID_SOCKET)
&&(getsockopt(Connection->sockAccept,
SOL_SOCKET,
0x700C/*SO_CONNECT_TIME*/,
(char *)&Connect_Time,
&Size)==SOCKET_ERROR))
{/*取连接时间计数失败*/
int Result=WSAGetLastError();
if(Result!=WSAENOTSOCK)
{
continue;
}
//Connection->sockAccept=INVALID_SOCKET;
}
else
{
if((tcpIOCP->TuningListenState>LS_CLOSED)&&
(Connection->sockAccept!=INVALID_SOCKET))
{
/*响应未超时*/
continue;
}
}
tcpIOCP->DumpConnection(Connection);
}
}
__finally
{
LeaveCriticalSection(&(tcpIOCP->conn_CriticalSection));
}
}
/*处理用户连接回收站*/
/*预进处用户连接回收站操作临界区*/
if(TryEnterCriticalSection(&(tcpIOCP->conn_DUMP_CriticalSection)))
{
try
{
for(int Index=tcpIOCP->FrecycleConnectionList.size()-1;Index>=0;Index--)
{
DWORD Connect_Time;
int Size=sizeof(DWORD);
Connection=tcpIOCP->FrecycleConnectionList.at(Index);
if((Connection->sockAccept!=INVALID_SOCKET)&&
getsockopt(Connection->sockAccept,
SOL_SOCKET,
0x700C/*SO_CONNECT_TIME*/,
(char *)&Connect_Time,
&Size)==SOCKET_ERROR)
{
int Result=WSAGetLastError();
if(Result!=WSAENOTSOCK)
{
closesocket(Connection->sockAccept);
//Connection->sockAccept=INVALID_SOCKET;
continue;
}
tcpIOCP->InternalOnBeforeDisconnect(Connection);
//Connection->sockAccept=INVALID_SOCKET;
}
if(Connection->sockAccept!=INVALID_SOCKET)
{
//tcpIOCP->InternalOnBeforeDisconnect(Connection);
closesocket(Connection->sockAccept);
}
//if(Connection->I_OverLappedEx!=NULL&&Connection->I_OverLappedEx!=NULL)
if(((0<Connection->I_OverLappedEx->LockCount)||
(0<Connection->O_OverLappedEx->LockCount))&&
(tcpIOCP->ThreadCount>=1)&&
((time(0)-Connection->LastDataTime)<180/*180秒时时间*/)&&
(tcpIOCP->TuningListenState>LS_CLOSED))
continue;
tcpIOCP->FrecycleConnectionList.erase(tcpIOCP->FrecycleConnectionList.begin()+Index);
tcpIOCP->InternalOnDisconnect(Connection);
tcpIOCP->InternalFreeDataNode(Connection->O_DATA);
DeleteCriticalSection(&(Connection->ctx_CriticalSection));
FreeEx(Connection->I_OverLappedEx);
Connection->I_OverLappedEx=NULL;
FreeEx(Connection->O_OverLappedEx);
Connection->O_OverLappedEx=NULL;
FreeEx(Connection);
Connection=NULL;
}
}
__finally
{
LeaveCriticalSection(&(tcpIOCP->conn_DUMP_CriticalSection));
}
}
//SetEvent(tcpIOCP->EventArray[0]);
}
}
__finally
{
_endthreadex(Result);
}
return Result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -