⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit_purifierthread.cpp

📁 一个完成端口的框架程序
💻 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 + -