| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #include "StdAfx.h"
- #include "LNAcceptor.h"
- #include "LNBuffer.h"
- #include "AppService.h"
- string g_strLocalIp;
- CLNAcceptor::CLNAcceptor(CProtocolHandler * pHandler)
- {
- m_pHandler = pHandler;
- }
- CLNAcceptor::~CLNAcceptor(void)
- {
- }
- CLNContext* CLNAcceptor::make_handler()
- {
- CLNContext* pContext = new CLNContext();
- if(pContext)
- {
- CLNBuffer* pBuffer = new CLNBuffer();
- pContext->SetBuffer(pBuffer);
- pContext->SetProtocolHandler(m_pHandler);
- cs.Lock();
- m_lstClientContext.push_back(pContext);
- cs.Unlock();
- }
- return pContext;
- }
- BOOL CLNAcceptor::Start()
- {
- Stop();
- m_bWork = true;
- m_pThread = new std::thread(ThreadProc, (DWORD_PTR)this);
- return TRUE;
- }
- void CLNAcceptor::Stop()
- {
- m_bWork = false;
- if (m_pThread)
- {
- m_pThread->join();
- delete m_pThread;
- m_pThread = nullptr;
- }
- }
- void CLNAcceptor::OnClearContext()
- {
- Lock();
- list<CLNContext*>::iterator it = m_lstClientContext.begin();
- for(; it != m_lstClientContext.end(); )
- {
- CLNContext* pContext = *it;
- if(pContext == NULL)
- {
- it = m_lstClientContext.erase(it);
- continue;
- }
- UINT nIdleTime = pContext->GetIdleTime2();
- if((nIdleTime > 180) || pContext->IsInactive(INFINITE))
- {
- auto strAddr = pContext->GetIPAdressNew();
- SPDLOG_ERROR("心跳超时.{} ", strAddr);
- //删除会话
- if(pContext->Delete())
- {
- SPDLOG_ERROR("删除链接.{} ", strAddr);
- it = m_lstClientContext.erase(it);
- continue;
- }
- }
- it++;
- }
- Unlock();
- }
- void CLNAcceptor::ClearAllContexts()
- {
- int nRepeatNum = 20;
- while(true)
- {
- TRACE("nRepeatNum = %d\n", nRepeatNum);
- if(nRepeatNum < 0)
- break;
- BOOL bForced = (nRepeatNum == 0) ? TRUE : FALSE;
- Lock();
- if(m_lstClientContext.empty())
- {
- Unlock();
- return;
- }
- list<CLNContext*>::iterator it = m_lstClientContext.begin();
- for(; it != m_lstClientContext.end(); )
- {
- CLNContext* pContext = *it;
- if((pContext == NULL) || pContext->Delete(bForced))
- it = m_lstClientContext.erase(it);
- else
- it++;
- }
- Unlock();
- Sleep(100);
- nRepeatNum--;
- }
- Lock();
- m_lstClientContext.clear();
- Unlock();
- }
- int CLNAcceptor::GetContextNum()
- {
- Lock();
- int nNum = (int)m_lstClientContext.size();
- Unlock();
- return nNum;
- }
- CLNContext* CLNAcceptor::FindContext(DWORD_PTR pContext)
- {
- CLNContext* pFind = nullptr;
- Lock();
- for (auto it : m_lstClientContext)
- {
- if (pContext == (DWORD_PTR)it)
- {
- pFind = (CLNContext*)it->GetSharedPointer();
- break;
- }
- }
- Unlock();
- return pFind;
- }
- void CLNAcceptor::SendDataAllContexts(uint8_t* data, size_t len)
- {
- Lock();
- for (auto it : m_lstClientContext)
- {
- auto pContext = (CLNContext*)it;
- pContext->Send(data, len);
- }
- Unlock();
- }
- void CLNAcceptor::ThreadProc(DWORD_PTR wparam)
- {
- CLNAcceptor* pThis = (CLNAcceptor*)wparam;
- SPDLOG_WARN("10090 心跳线程启动");
- Sleep(2000);
- uint8_t bSend[100] = { 0 };
- int len = CHjDataConver::conver_sendpack(bSend, nullptr, 0, 0, 0, E_ZL_PROTOCAL::ZL_KEEP, OR_DATA_INFO(0, 0, 1, 3, OPT_TYPE::OPT_SYNC));
- time_t tmNow;
- while (pThis->m_bWork)
- {
- for (size_t i = 0; i < 10; i++)
- {
- Sleep(500);
- if (pThis->m_bWork == false) break;
- }
- //发送心跳
- time(&tmNow);
- if (tmNow - pThis->m_tmLastKeep > 30)
- {
- pThis->SendDataAllContexts(bSend, len);
- pThis->m_tmLastKeep = tmNow;
- }
- if (pThis->m_lstClientContext.size() == 0)
- {
- if (pThis->m_tmLastZero == 0)
- pThis->m_tmLastZero = tmNow;
- else if (tmNow - pThis->m_tmLastZero > 60)
- {
- bool bRet = false;
- if (bRet)
- {
- SPDLOG_ERROR("关闭{}端口", 10090);
- pThis->close();
- SPDLOG_ERROR("监听{}端口", 10090);
- if (pThis->listen(10090) == -1)
- SPDLOG_CRITICAL("端口{} tcp 监听失败", 10090);
- pThis->m_tmLastZero = tmNow;
- }
- }
- }
- else
- if (!pThis->m_tmLastZero) pThis->m_tmLastZero = 0;
- //清除链接
- pThis->OnClearContext();
- }
- SPDLOG_WARN("10090 心跳线程退出");
- }
|