CheckThread.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //  
  3. //  FileName    :   CheckThread.cpp
  4. //  Version     :   1.0
  5. //  Creater     :   Linsuyi
  6. //  Date        :   2002-01-17  10:37:18
  7. //  Comment     :   KAVuser-net check thread source file
  8. //  
  9. ////////////////////////////////////////////////////////////////////////////////
  10. #include "Stdafx.h"
  11. #include "CheckThread.h"
  12. #include "DataDefine.h"
  13. #include "UdpSocket.h"
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CCheckThread::CCheckThread()
  18. {
  19.     m_nTimeOut = defCHECK_TIME_OUT;
  20.     m_nTryTimes = defCHECK_TRY_TIMES;
  21.     
  22.     m_ulContextWith = 0;
  23.     m_piCallback = NULL;
  24.     
  25.     m_hKillEvent = NULL;
  26. }
  27. CCheckThread::~CCheckThread()
  28. {
  29. }
  30. int CCheckThread::SetCheckCallback(IKCheckCallback *piCallback, ULONG ulContextWith)
  31. {
  32.     int nResult = false;
  33.     int nRetCode = false;
  34.     
  35.     nRetCode = CBusyThread::IsThreadOK();
  36.     if (nRetCode)
  37.         goto Exit0;
  38.     
  39.     ulContextWith = ulContextWith;
  40.     m_piCallback = piCallback;
  41.     
  42.     nResult = true;
  43.     
  44. Exit0:
  45.     return nResult;
  46. }
  47. int CCheckThread::AddCheckServer(const char *pcszCheckServer, int nCheckPort)
  48. {
  49.     int nResult = false;
  50.     int nAddServer = -1;
  51.     
  52.     TRY
  53.     {
  54.         nAddServer = m_paServerAddress.Add((void *)pcszCheckServer);
  55.         
  56.         m_waServerPort.Add((WORD)nCheckPort);
  57.     }
  58.     CATCH_ALL(pException);
  59.     {
  60.         pException->Delete();
  61.         goto Exit0;
  62.     }
  63.     END_CATCH_ALL;
  64.     
  65.     nResult = true;
  66.     
  67. Exit0:
  68.     if ((!nResult) && (nAddServer != -1))
  69.     {
  70.         m_paServerAddress.RemoveAt(nAddServer);
  71.     }
  72.     return nResult;
  73. }
  74. int CCheckThread::Create()
  75. {
  76.     int nResult = false;
  77.     int nRetCode = false;
  78.     
  79.     nRetCode = IsThreadOK();
  80.     if (nRetCode)
  81.         goto Exit0;
  82.     
  83. ASSERT(NULL == m_hKillEvent);
  84.     
  85.     m_hKillEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
  86.     if (NULL == m_hKillEvent)
  87.     {
  88.         ASSERT(FALSE);
  89.         goto Exit0;
  90.     }
  91.     
  92.     nResult = true;
  93.     
  94. Exit0:
  95.     return nResult;
  96. }
  97. void CCheckThread::Destroy()
  98. {
  99.     ASSERT(!IsThreadOK());
  100.     
  101.     if (m_hKillEvent != NULL)
  102.     {
  103.         ::CloseHandle(m_hKillEvent);
  104.         m_hKillEvent = NULL;
  105.     }
  106. }
  107. int CCheckThread::StartThread()
  108. {
  109.     int nResult = false;
  110.     ULONG ulRetCode = 0;
  111.     
  112.     if (
  113.         (NULL == m_hKillEvent) || 
  114.         (NULL == m_piCallback)
  115.     )
  116.     {
  117.         ASSERT(FALSE);
  118.         goto Exit0;
  119.     }
  120.     
  121.     ulRetCode = ::WaitForSingleObject(m_hKillEvent, 0);
  122.     if (WAIT_OBJECT_0 == ulRetCode)
  123.         ::ResetEvent(m_hKillEvent);
  124.     
  125.     nResult = CBusyThread::StartThread();
  126.     
  127. Exit0:
  128.     return nResult;
  129. }
  130. int CCheckThread::QueryStop()
  131. {
  132.     int nResult = false;
  133.     ULONG ulRetCode = 0;
  134.     
  135.     ASSERT(m_hKillEvent != NULL);
  136.     if (m_hKillEvent != NULL)
  137.     {
  138.         ulRetCode = ::WaitForSingleObject(m_hKillEvent, 0);
  139.         
  140.         nResult = (WAIT_OBJECT_0 == ulRetCode);
  141.     }
  142.     
  143.     return nResult;
  144. }
  145. int CCheckThread::RemindStop()
  146. {
  147.     int nResult = false;
  148.     
  149.     if (m_hKillEvent != NULL)
  150.     {
  151.         nResult = ::SetEvent(m_hKillEvent);
  152.     }
  153.     
  154.     return nResult;
  155. }
  156. ULONG CCheckThread::MainExecution()
  157. {
  158.     ULONG ulResult = 0;
  159.     int nRetCode = 0;
  160.     int nDataReady = false;
  161.     int nExitDirect = false;    
  162.     CUdpSocket CheckSocket;
  163.     
  164.     int nAddrIndex = 0;
  165.     int nCheckResult = defConnectServerFailed - 1;
  166.     
  167.     int nCheckServerPort = 0;
  168.     const char *pcszCheckServerAddr = NULL;
  169.     
  170.     int nTimeOut = 0;
  171.     int nTryTimes = 0;
  172.     int nCheckServerCount = 0;
  173.     
  174.     int nSendBufSize;
  175.     unsigned char *pbySendBuffer = NULL;
  176.     
  177.     int nRecvBufSize = defCHECK_RECEIVE_MAX_SIZE;
  178.     unsigned char byRecvBuffer[defCHECK_RECEIVE_MAX_SIZE];
  179.     
  180.     if (NULL == m_piCallback)
  181.         goto Exit0;
  182.     
  183.     nRetCode = m_piCallback->GetCheckInfo(
  184.         m_ulContextWith,
  185.         &nSendBufSize,
  186.         &pbySendBuffer
  187.     );
  188.     if (
  189.         (!nRetCode) ||
  190.         (nSendBufSize <= 0) ||
  191.         (NULL == pbySendBuffer)
  192.     )
  193.         goto Exit0;
  194.     
  195.     nRetCode = QueryStop();
  196.     if (nRetCode)
  197.     {
  198.         nExitDirect = true;
  199.         goto Exit0;
  200.     }
  201.     
  202.     nRetCode = CheckSocket.Create();
  203.     if (!nRetCode)
  204.         goto Exit0;
  205.     
  206.     nCheckServerCount = m_paServerAddress.GetSize();
  207.     for (nAddrIndex = 0; nAddrIndex < nCheckServerCount; nAddrIndex++)
  208.     {
  209.         nRetCode = QueryStop();
  210.         if (nRetCode)
  211.         {
  212.             nExitDirect = true;
  213.             goto Exit0;
  214.         }
  215.         
  216.         nCheckServerPort = m_waServerPort.GetAt(nAddrIndex);
  217.         if (nCheckServerPort <= 0)
  218.             nCheckServerPort = defCHECK_SERVER_PORT;
  219.         pcszCheckServerAddr = (const char *)m_paServerAddress.GetAt(nAddrIndex);
  220.         
  221.         nRetCode = CheckSocket.SetRemoteAddress(pcszCheckServerAddr, nCheckServerPort);
  222.         if (!nRetCode)
  223.             continue;
  224.         
  225.         nTimeOut = m_nTimeOut;
  226.         nTryTimes = m_nTryTimes;
  227.         
  228.         while (nTryTimes-- > 0)
  229.         {
  230.             int nSeparate = defCHECK_TIME_SEP;
  231.             
  232.             nRetCode = QueryStop();
  233.             if (nRetCode)
  234.             {
  235.                 nExitDirect = true;
  236.                 goto Exit0;
  237.             }
  238.             
  239.             nRetCode = CheckSocket.Send(nSendBufSize, pbySendBuffer);
  240.             if (nRetCode <= 0)
  241.             {
  242.                 ASSERT(FALSE);
  243.                 continue;
  244.             }
  245.             
  246.             nTimeOut /= nSeparate;
  247.             while (nSeparate-- > 0)
  248.             {
  249.                 nDataReady = CheckSocket.Select(true, false, false, nTimeOut);
  250.                 if (SOCKET_ERROR == nDataReady)
  251.                     break;
  252.                 nRetCode = QueryStop();
  253.                 if (nRetCode)
  254.                 {
  255.                     nExitDirect = true;
  256.                     goto Exit0; 
  257.                 }
  258.                 if (nDataReady <= 0)
  259.                     continue;
  260.                 
  261.                 break;
  262.             }
  263.             if (SOCKET_ERROR == nDataReady)
  264.                 break;
  265.             
  266.             if (nDataReady > 0)
  267.             {
  268.                 ZeroMemory(byRecvBuffer, nRecvBufSize);
  269.                 nRetCode = CheckSocket.ReceiveFrom(nRecvBufSize, byRecvBuffer);
  270.                 if (nRetCode <= 0)
  271.                     break;
  272.                 
  273.                 nCheckResult = m_piCallback->CheckRecvInfo(
  274.                     m_ulContextWith,
  275.                     nRetCode,
  276.                     byRecvBuffer
  277.                 );
  278.                 if (nCheckResult >= defInhibitiveSerialNumber)
  279.                     goto Exit1;
  280.             }
  281.         }
  282.     }
  283.     
  284. Exit1:
  285.     ulResult = true;
  286.     
  287. Exit0:
  288.     if (!nExitDirect && (m_piCallback != NULL))
  289.     {
  290.         m_piCallback->CheckResult(m_ulContextWith, nCheckResult);
  291.     }
  292.     
  293.     nRetCode = CheckSocket.IsSocketOK();
  294.     if (nRetCode)
  295.         CheckSocket.Destroy();
  296.     
  297.     return ulResult;
  298. }