#include "StdAfx.h" #include "LNAcceptor.h" #include "LNBuffer.h" #include "AppService.h" CLNAcceptor::CLNAcceptor(CProtocolHandler * pHandler) { m_pHandler = pHandler; } CLNAcceptor::~CLNAcceptor(void) { } CLNContext* CLNAcceptor::make_handler() { CLNContext* pContext = new CLNContext(); if(pContext) { CLNBuffer* pBuffer = new CLNBuffer(); pBuffer->pContext = pContext; //赋值一下父指针 pContext->SetBuffer(pBuffer); //set client protocol handler //pContext->SetProtocolHandler(CAppService::Instance()->GetHandle()); pContext->SetProtocolHandler(m_pHandler); cs.Lock(); m_lstClientContext.push_back(pContext); cs.Unlock(); } return pContext; } void CLNAcceptor::OnClearContext() { Lock(); list::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 > 300) || pContext->IsInactive(INFINITE)) { auto strAddr = pContext->GetIPAdressNew(); CSimpleLog::Info(fmt::format("心跳超时.{} imei:{} {}", strAddr, pContext->m_mapImei.size() ? (LPCSTR)pContext->m_mapImei.begin()->first : "", (LPCSTR)pContext->ivuname).c_str()); //删除会话 if(pContext->Delete()) { CSimpleLog::Info(fmt::format("删除链接.{} ", strAddr).c_str()); 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::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; } CLNContext* CLNAcceptor::FindContextByIMEI(const char *imei) { CLNContext* pFind = nullptr; Lock(); for (auto it : m_lstClientContext) { if (it->m_mapImei.find(imei) != it->m_mapImei.end()) { 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(); } CLNContext* CLNAcceptor::FindContextByIVU(const char *imei) { CLNContext* pFind = nullptr; Lock(); for (auto it : m_lstClientContext) { if (it->ivuname.CompareNoCase(imei) == 0) { pFind = (CLNContext*)it->GetSharedPointer(); break; } } Unlock(); return pFind; } void CLNAcceptor::GetAllContextImei(std::list& lst) { Lock(); for (const auto& it : m_lstClientContext) { for (const auto& ik : it->m_mapImei) lst.push_back(ik.first); } Unlock(); } int CLNAcceptor::validate_connection(const ACE_Asynch_Accept::Result& result, const ACE_INET_Addr& remote, const ACE_INET_Addr& local) { auto ip_addr = local.get_ip_address(); auto strIp = local.get_host_addr();; //if (ip_addr != 0x7F000001) // g_strLocalIp = strIp; SPDLOG_ERROR("new connection: {}:{} local:{}:{}", remote.get_host_addr(), remote.get_port_number(), strIp, local.get_port_number()); return 0; }