bool CConsoleHandler::ServerClose() { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::ServerClose]Close(%d) OK.\n", GetConnectID())); //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); //msg_queue()->deactivate(); shutdown(); m_u1ConnectState = CONNECT_SERVER_CLOSE; return true; }
//关闭链接 int CConsoleHandler::handle_close(ACE_HANDLE h, ACE_Reactor_Mask mask) { if(h == ACE_INVALID_HANDLE) { OUR_DEBUG((LM_DEBUG,"[CConsoleHandler::handle_close] h is NULL mask=%d.\n", (int)mask)); } OUR_DEBUG((LM_DEBUG,"[CConsoleHandler::handle_close]Connectid=[%d] begin(%d)...\n",GetConnectID(), errno)); Close(2); return 0; }
bool CProConsoleHandle::SendMessage(IBuffPacket* pBuffPacket) { CConsolePacketParse PacketParse; if(NULL == pBuffPacket) { //OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::SendMessage] Connectid=[%d] pBuffPacket is NULL.\n", GetConnectID())); Close(); return false; } ACE_Message_Block* pMbData = NULL; int nSendLength = PacketParse.MakePacketLength(GetConnectID(), pBuffPacket->GetPacketLen()); pMbData = App_MessageBlockManager::instance()->Create(nSendLength); //这里组成返回数据包 PacketParse.MakePacket(GetConnectID(), pBuffPacket->GetData(), pBuffPacket->GetPacketLen(), pMbData); App_BuffPacketManager::instance()->Delete(pBuffPacket); PutSendPacket(pMbData); return true; }
bool CProConsoleHandle::ServerClose() { OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::ServerClose] Close(%d) delete OK.\n", GetConnectID())); m_Reader.cancel(); m_Writer.cancel(); if(this->handle() != ACE_INVALID_HANDLE) { ACE_OS::closesocket(this->handle()); this->handle(ACE_INVALID_HANDLE); } m_u1ConnectState = CONNECT_SERVER_CLOSE; return true; }
bool CProConsoleHandle::Close(int nIOCount) { m_ThreadWriteLock.acquire(); if(nIOCount > m_nIOCount) { m_nIOCount = 0; } if(m_nIOCount > 0) { m_nIOCount -= nIOCount; } m_ThreadWriteLock.release(); //OUR_DEBUG((LM_DEBUG, "[CProConsoleHandle::Close]ConnectID=%d, m_nIOCount = %d.\n", GetConnectID(), m_nIOCount)); if(m_nIOCount == 0) { m_ThreadWriteLock.acquire(); m_Reader.cancel(); m_Writer.cancel(); if(this->handle() != ACE_INVALID_HANDLE) { ACE_OS::closesocket(this->handle()); this->handle(ACE_INVALID_HANDLE); } m_ThreadWriteLock.release(); OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::Close] Close(%d) delete OK.\n", GetConnectID())); delete this; return true; } return false; }
bool CConsoleHandler::Close(int nIOCount) { m_ThreadLock.acquire(); if (nIOCount > m_nIOCount) { m_nIOCount = 0; } if (m_nIOCount > 0) { m_nIOCount -= nIOCount; } m_ThreadLock.release(); //OUR_DEBUG((LM_ERROR, "[CConsoleHandler::Close]ConnectID=%d,m_nIOCount=%d.\n", GetConnectID(), m_nIOCount)); //从反应器注销事件 if (m_nIOCount == 0) { //删除对象缓冲的PacketParse if (m_pCurrMessage != NULL) { m_pCurrMessage->release(); } //msg_queue()->deactivate(); shutdown(); OUR_DEBUG((LM_ERROR, "[CConsoleHandler::Close]Close(%d) OK.\n", GetConnectID())); //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); delete this; return true; } return false; }
int CConsoleHandler::open(void*) { m_nIOCount = 1; //初始化key值列表 m_ConsoleMessage.SetConsoleKey(App_MainConfig::instance()->GetConsoleKey()); int nRet = ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>::open(); if(nRet != 0) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::open]ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>::open() error [%d].\n", nRet)); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::open]ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>::open() error [%d].", nRet); return -1; } //设置链接为非阻塞模式 if (this->peer().enable(ACE_NONBLOCK) == -1) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::open]this->peer().enable = ACE_NONBLOCK error.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::open]this->peer().enable = ACE_NONBLOCK error."); return -1; } //获得远程链接地址和端口 if(this->peer().get_remote_addr(m_addrRemote) == -1) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::open]this->peer().get_remote_addr error.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::open]this->peer().get_remote_addr error."); return -1; } //判断是否在服务器允许的IP范围内 if(App_MainConfig::instance()->CompareConsoleClinetIP(m_addrRemote.get_host_addr()) == false) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::open]this IP is abort.\n")); return -1; } OUR_DEBUG((LM_INFO, "[CConsoleHandler::open] Connection from [%s:%d]\n",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number())); m_atvConnect = ACE_OS::gettimeofday(); m_atvInput = ACE_OS::gettimeofday(); m_atvOutput = ACE_OS::gettimeofday(); m_atvSendAlive = ACE_OS::gettimeofday(); m_u4AllRecvCount = 0; m_u4AllSendCount = 0; m_u4AllRecvSize = 0; m_u4AllSendSize = 0; //设置接收缓冲池的大小 int nTecvBuffSize = MAX_MSG_SOCKETBUFF; //ACE_OS::setsockopt(this->get_handle(), SOL_SOCKET, SO_RCVBUF, (char* )&nTecvBuffSize, sizeof(nTecvBuffSize)); ACE_OS::setsockopt(this->get_handle(), SOL_SOCKET, SO_SNDBUF, (char* )&nTecvBuffSize, sizeof(nTecvBuffSize)); //int nOverTime = MAX_MSG_SENDTIMEOUT; //ACE_OS::setsockopt(this->get_handle(), SOL_SOCKET, SO_SNDTIMEO, (char* )&nOverTime, sizeof(nOverTime)); m_pPacketParse = App_PacketParsePool::instance()->Create(); if(NULL == m_pPacketParse) { OUR_DEBUG((LM_DEBUG,"[%t|CConnectHandle::open] Open(%d) m_pPacketParse new error.\n", GetConnectID())); return -1; } //申请头的大小对应的mb m_pCurrMessage = App_MessageBlockManager::instance()->Create(m_pPacketParse->GetPacketHeadLen()); if(m_pCurrMessage == NULL) { AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); OUR_DEBUG((LM_ERROR, "[CConnectHandle::RecvClinetPacket] pmb new is NULL.\n")); return -1; } //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Connection from [%s:%d].",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number()); m_u1ConnectState = CONNECT_OPEN; return nRet; }
bool CConsoleHandler::PutSendPacket(ACE_Message_Block* pMbData) { ACE_Time_Value nowait(MAX_MSG_PACKETTIMEOUT); if(NULL == pMbData) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::SendPacket] ConnectID = %d, get_handle() == ACE_INVALID_HANDLE.\n", GetConnectID())); Close(); return false; } if(get_handle() == ACE_INVALID_HANDLE) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::SendPacket] ConnectID = %d, get_handle() == ACE_INVALID_HANDLE.\n", GetConnectID())); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::SendPacket] ConnectID = %d, get_handle() == ACE_INVALID_HANDLE.\n", GetConnectID()); pMbData->release(); Close(); return false; } //发送数据 char* pData = pMbData->rd_ptr(); if(NULL == pData) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::SendPacket] ConnectID = %d, pData is NULL.\n", GetConnectID())); pMbData->release(); Close(); return false; } int nIsSendSize = 0; //循环发送,直到数据发送完成。 while(true) { int nCurrSendSize = (int)(pMbData->length() - nIsSendSize); if(nCurrSendSize <= 0) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::SendPacket] ConnectID = %d, nCurrSendSize error is %d.\n", GetConnectID(), nCurrSendSize)); pMbData->release(); return false; } int nDataLen = this->peer().send(pMbData->rd_ptr(), nCurrSendSize, &nowait); int nErr = ACE_OS::last_error(); if(nDataLen <= 0) { if(nErr == EWOULDBLOCK) { //如果发送堵塞,则等10毫秒后再发送。 ACE_Time_Value tvSleep(0, 10 * MAX_BUFF_1000); ACE_OS::sleep(tvSleep); continue; } OUR_DEBUG((LM_ERROR, "[CConsoleHandler::SendPacket] ConnectID = %d, error = %d.\n", GetConnectID(), errno)); pMbData->release(); m_atvOutput = ACE_OS::gettimeofday(); Close(); return false; } else if(nDataLen >= nCurrSendSize) //当数据包全部发送完毕,清空。 { //OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_output] ConnectID = %d, send (%d) OK.\n", GetConnectID(), msg_queue()->is_empty())); m_u4AllSendCount += 1; m_u4AllSendSize += (uint32)pMbData->length(); pMbData->release(); m_atvOutput = ACE_OS::gettimeofday(); Close(); return true; } else { pMbData->rd_ptr(nDataLen); nIsSendSize += nDataLen; m_atvOutput = ACE_OS::gettimeofday(); continue; } } return true; }
bool CConsoleHandler::SendMessage(IBuffPacket* pBuffPacket) { m_ThreadLock.acquire(); m_nIOCount++; m_ThreadLock.release(); //OUR_DEBUG((LM_DEBUG,"[CConsoleHandler::SendMessage]Connectid=%d,m_nIOCount=%d.\n", GetConnectID(), m_nIOCount)); CPacketParse PacketParse; if(NULL == pBuffPacket) { OUR_DEBUG((LM_DEBUG,"[CConsoleHandler::SendMessage] Connectid=[%d] pBuffPacket is NULL.\n", GetConnectID())); Close(); return false; } ACE_Message_Block* pMbData = NULL; int nSendLength = PacketParse.MakePacketLength(pBuffPacket->GetPacketLen()); pMbData = App_MessageBlockManager::instance()->Create(nSendLength); //这里组成返回数据包 PacketParse.MakePacket(pBuffPacket->GetData(), pBuffPacket->GetPacketLen(), pMbData); App_BuffPacketManager::instance()->Delete(pBuffPacket); PutSendPacket(pMbData); return true; }
//接受数据 int CConsoleHandler::handle_input(ACE_HANDLE fd) { m_ThreadLock.acquire(); m_nIOCount++; m_ThreadLock.release(); //OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_input]ConnectID=%d,m_nIOCount=%d.\n", GetConnectID(), m_nIOCount)); ACE_Time_Value nowait(MAX_MSG_PACKETTIMEOUT); m_atvInput = ACE_OS::gettimeofday(); if(fd == ACE_INVALID_HANDLE) { m_u4CurrSize = 0; OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_input]fd == ACE_INVALID_HANDLE.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::handle_input]fd == ACE_INVALID_HANDLE."); return -1; } //判断数据包结构是否为NULL if(m_pPacketParse == NULL) { m_u4CurrSize = 0; OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_input]m_pPacketParse == NULL.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::handle_input]m_pPacketParse == NULL."); return -1; } //判断缓冲是否为NULL if(m_pCurrMessage == NULL) { m_u4CurrSize = 0; OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_input]m_pCurrMessage == NULL.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::handle_input]m_pCurrMessage == NULL."); if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } if(m_pCurrMessage != NULL && m_pPacketParse->GetMessageBody() != m_pCurrMessage && m_pPacketParse->GetMessageBody() != m_pCurrMessage) { m_pCurrMessage->release(); m_pCurrMessage = NULL; } App_PacketParsePool::instance()->Delete(m_pPacketParse); return -1; } int nCurrCount = (uint32)m_pCurrMessage->size() - m_u4CurrSize; //这里需要对m_u4CurrSize进行检查。 if(nCurrCount < 0) { OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_input][%d] nCurrCount < 0 m_u4CurrSize = %d.\n", GetConnectID(), m_u4CurrSize)); m_u4CurrSize = 0; if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } if(m_pCurrMessage != NULL && m_pPacketParse->GetMessageBody() != m_pCurrMessage && m_pPacketParse->GetMessageBody() != m_pCurrMessage) { m_pCurrMessage->release(); m_pCurrMessage = NULL; } App_PacketParsePool::instance()->Delete(m_pPacketParse); return -1; } int nDataLen = this->peer().recv(m_pCurrMessage->wr_ptr(), nCurrCount, MSG_NOSIGNAL, &nowait); if(nDataLen <= 0) { m_u4CurrSize = 0; uint32 u4Error = (uint32)errno; OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_input] ConnectID = %d, recv data is error nDataLen = [%d] errno = [%d].\n", GetConnectID(), nDataLen, u4Error)); sprintf_safe(m_szError, MAX_BUFF_500, "[CConsoleHandler::handle_input] ConnectID = %d, recv data is error[%d].\n", GetConnectID(), nDataLen); if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } if(m_pCurrMessage != NULL && m_pPacketParse->GetMessageBody() != m_pCurrMessage && m_pPacketParse->GetMessageBody() != m_pCurrMessage) { m_pCurrMessage->release(); m_pCurrMessage = NULL; } App_PacketParsePool::instance()->Delete(m_pPacketParse); return -1; } m_u4CurrSize += nDataLen; m_pCurrMessage->wr_ptr(nDataLen); //如果没有读完,短读 if(m_pCurrMessage->size() > m_u4CurrSize) { Close(); return 0; } else if(m_pCurrMessage->length() == m_pPacketParse->GetPacketHeadLen() && m_pPacketParse->GetIsHead() == false) { m_pPacketParse->SetPacketHead(m_pCurrMessage->rd_ptr(), (uint32)m_pCurrMessage->length()); uint32 u4PacketBodyLen = m_pPacketParse->GetPacketDataLen(); m_u4CurrSize = 0; //如果超过了最大包长度,为非法数据 if(u4PacketBodyLen >= MAX_MSG_PACKETLENGTH || u4PacketBodyLen <= 0) { m_u4CurrSize = 0; OUR_DEBUG((LM_ERROR, "[CConsoleHandler::handle_read_stream]u4PacketHeadLen(%d) more than MAX_MSG_PACKETLENGTH.", u4PacketBodyLen)); if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } if(m_pCurrMessage != NULL && m_pPacketParse->GetMessageBody() != m_pCurrMessage && m_pPacketParse->GetMessageBody() != m_pCurrMessage) { m_pCurrMessage->release(); m_pCurrMessage = NULL; } App_PacketParsePool::instance()->Delete(m_pPacketParse); return -1; } else { m_pPacketParse->SetMessageHead(m_pCurrMessage); //申请头的大小对应的mb m_pCurrMessage = App_MessageBlockManager::instance()->Create(m_pPacketParse->GetPacketDataLen()); if(m_pCurrMessage == NULL) { m_u4CurrSize = 0; AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); OUR_DEBUG((LM_ERROR, "[CConnectHandle::RecvClinetPacket] pmb new is NULL.\n")); if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } if(m_pCurrMessage != NULL && m_pPacketParse->GetMessageBody() != m_pCurrMessage && m_pPacketParse->GetMessageBody() != m_pCurrMessage) { m_pCurrMessage->release(); m_pCurrMessage = NULL; } App_PacketParsePool::instance()->Delete(m_pPacketParse); return -1; } Close(); } } else { //接受完整数据完成,开始分析完整数据包 m_pPacketParse->SetPacketData(m_pCurrMessage->rd_ptr(), (uint32)m_pCurrMessage->length()); m_pPacketParse->SetMessageBody(m_pCurrMessage); CheckMessage(); m_u4CurrSize = 0; //申请新的包 m_pPacketParse = App_PacketParsePool::instance()->Create(); if(NULL == m_pPacketParse) { OUR_DEBUG((LM_DEBUG,"[%t|CConnectHandle::open] Open(%d) m_pPacketParse new error.\n", GetConnectID())); return -1; } //申请头的大小对应的mb m_pCurrMessage = App_MessageBlockManager::instance()->Create(m_pPacketParse->GetPacketHeadLen()); if(m_pCurrMessage == NULL) { AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); OUR_DEBUG((LM_ERROR, "[CConnectHandle::RecvClinetPacket] pmb new is NULL.\n")); return -1; } Close(); } return 0; }
bool CProConsoleHandle::CheckMessage() { if(m_pPacketParse->GetMessageHead() != NULL && m_pPacketParse->GetMessageBody() != NULL) { m_u4AllRecvSize += (uint32)m_pPacketParse->GetMessageHead()->length() + (uint32)m_pPacketParse->GetMessageBody()->length(); m_u4AllRecvCount++; //发送回复信息 IBuffPacket* pBuffPacket = App_BuffPacketManager::instance()->Create(); //将数据Buff放入消息体中,传递给处理类。 uint32 u4Return = (uint32)m_ConsoleMessage.Dispose(m_pPacketParse->GetMessageBody(), pBuffPacket); if(CONSOLE_MESSAGE_SUCCESS == u4Return) { if(pBuffPacket->GetPacketLen() > 0) { SendMessage((IBuffPacket* )pBuffPacket); } } SAFE_DELETE(m_pPacketParse); } else { OUR_DEBUG((LM_ERROR, "[CProConsoleHandle::CheckMessage] ConnectID = %d, m_pPacketParse is NULL.\n", GetConnectID())); } return true; }
bool CProConsoleHandle::RecvClinetPacket(uint32 u4PackeLen) { m_ThreadWriteLock.acquire(); m_nIOCount++; m_ThreadWriteLock.release(); //OUR_DEBUG((LM_ERROR, "[CProConsoleHandle::RecvClinetPacket]Connectid=%d, m_nIOCount=%d.\n", GetConnectID(), m_nIOCount)); ACE_Message_Block* pmb = NULL; pmb = App_MessageBlockManager::instance()->Create(u4PackeLen); if(pmb == NULL) { //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); OUR_DEBUG((LM_ERROR, "[CProConsoleHandle::RecvClinetPacket] pmb new is NULL.\n")); if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } SAFE_DELETE(m_pPacketParse); Close(2); return false; } if(m_Reader.read(*pmb, u4PackeLen) == -1) { //如果读失败,则关闭连接。 //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); OUR_DEBUG((LM_ERROR, "[CProConsoleHandle::RecvClinetPacket] m_reader.read is error(%d)(%d).\n", GetConnectID(), errno)); pmb->release(); if(m_pPacketParse->GetMessageHead() != NULL) { m_pPacketParse->GetMessageHead()->release(); } if(m_pPacketParse->GetMessageBody() != NULL) { m_pPacketParse->GetMessageBody()->release(); } SAFE_DELETE(m_pPacketParse); Close(2); return false; } return true; }
bool CProConsoleHandle::PutSendPacket(ACE_Message_Block* pMbData) { int nSendSize = m_u4AllSendSize; m_ThreadWriteLock.acquire(); m_nIOCount++; m_ThreadWriteLock.release(); //OUR_DEBUG ((LM_ERROR, "[CConnectHandler::PutSendPacket] Connectid=%d, m_nIOCount=%d!\n", GetConnectID(), m_nIOCount)); //异步发送方法 if(NULL != pMbData) { if(0 != m_Writer.write(*pMbData, pMbData->length())) { OUR_DEBUG ((LM_ERROR, "[CConnectHandler::PutSendPacket] Connectid=%d mb=%d m_writer.write error(%d)!\n", GetConnectID(), pMbData->length(), errno)); pMbData->release(); Close(); return false; } else { m_u4AllSendCount += 1; m_atvOutput = ACE_OS::gettimeofday(); return true; } //pMbData->release(); } else { OUR_DEBUG ((LM_ERROR,"[CConnectHandler::PutSendPacket] Connectid=%d mb is NULL!\n", GetConnectID())); Close(); return false; } }
void CProConsoleHandle::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result) { if(!result.success() || result.bytes_transferred()==0) { //链接断开 OUR_DEBUG ((LM_DEBUG,"[CConnectHandler::handle_write_stream] Connectid=[%d] begin(%d)...\n",GetConnectID(), errno)); //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); OUR_DEBUG((LM_DEBUG,"[CConnectHandler::handle_write_stream] Connectid=[%d] finish ok...\n", GetConnectID())); m_atvOutput = ACE_OS::gettimeofday(); App_MessageBlockManager::instance()->Close(&result.message_block()); Close(); return; } else { //短读不考虑 m_blCanWrite = true; m_atvOutput = ACE_OS::gettimeofday(); App_MessageBlockManager::instance()->Close(&result.message_block()); m_u4AllSendSize += (uint32)result.bytes_to_write(); Close(); return; } }
void CProConsoleHandle::handle_read_stream(const ACE_Asynch_Read_Stream::Result &result) { ACE_Message_Block& mb = result.message_block(); uint32 u4PacketLen = (uint32)result.bytes_transferred(); int nTran = (int)result.bytes_transferred(); if(!result.success() || result.bytes_transferred() == 0) { //链接断开 if(m_pPacketParse->GetMessageHead() != NULL) { App_MessageBlockManager::instance()->Close(m_pPacketParse->GetMessageHead()); } if(m_pPacketParse->GetMessageBody() != NULL) { App_MessageBlockManager::instance()->Close(m_pPacketParse->GetMessageBody()); } if(&mb != m_pPacketParse->GetMessageHead() && &mb != m_pPacketParse->GetMessageBody()) { //OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::handle_read_stream] Message_block release.\n")); App_MessageBlockManager::instance()->Close(&mb); } SAFE_DELETE(m_pPacketParse); OUR_DEBUG((LM_DEBUG,"[%tCConnectHandler::handle_read_stream]Connectid=[%d] error(%d)...\n", GetConnectID(), errno)); //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); //因为是要关闭连接,所以要多关闭一次IO,对应Open设置的1的初始值 Close(2); return; } m_atvInput = ACE_OS::gettimeofday(); if(result.bytes_transferred() < result.bytes_to_read()) { //短读,继续读 int nRead = (int)result.bytes_to_read() - (int)result.bytes_transferred(); if(-1 == m_Reader.read(mb, nRead)) { if(m_pPacketParse->GetMessageHead() != NULL) { App_MessageBlockManager::instance()->Close(m_pPacketParse->GetMessageHead()); } if(m_pPacketParse->GetMessageBody() != NULL) { App_MessageBlockManager::instance()->Close(m_pPacketParse->GetMessageBody()); } if(&mb != m_pPacketParse->GetMessageHead() && &mb != m_pPacketParse->GetMessageBody()) { App_MessageBlockManager::instance()->Close(&mb); } SAFE_DELETE(m_pPacketParse); OUR_DEBUG((LM_ERROR, "[CConnectHandler::handle_read_stream]Read Shoter error(%d).", errno)); //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Close Connection from [%s:%d] RecvSize = %d, RecvCount = %d, SendSize = %d, SendCount = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), m_u4AllRecvSize, m_u4AllRecvCount, m_u4AllSendSize, m_u4AllSendCount); //因为是要关闭连接,所以要多关闭一次IO,对应Open设置的1的初始值 Close(2); return; } } else if(mb.length() == m_pPacketParse->GetPacketHeadLen() && m_pPacketParse->GetIsHead() == false) { //判断头的合法性 m_pPacketParse->SetPacketHead(GetConnectID(), &mb, App_MessageBlockManager::instance()); uint32 u4PacketBodyLen = m_pPacketParse->GetPacketBodyLen(); //如果超过了最大包长度,为非法数据 if(u4PacketBodyLen >= MAX_MSG_PACKETLENGTH || u4PacketBodyLen <= 0) { OUR_DEBUG((LM_ERROR, "[CConnectHandler::handle_read_stream]u4PacketHeadLen(%d) more than MAX_MSG_PACKETLENGTH.", u4PacketBodyLen)); if(m_pPacketParse->GetMessageHead() != NULL) { App_MessageBlockManager::instance()->Close(m_pPacketParse->GetMessageHead()); } if(m_pPacketParse->GetMessageBody() != NULL) { App_MessageBlockManager::instance()->Close(m_pPacketParse->GetMessageBody()); } if(&mb != m_pPacketParse->GetMessageHead() && &mb != m_pPacketParse->GetMessageBody()) { App_MessageBlockManager::instance()->Close(&mb); } SAFE_DELETE(m_pPacketParse); Close(2); return; } else { Close(); RecvClinetPacket(u4PacketBodyLen); } } else { //接受完整数据完成,开始分析完整数据包 m_pPacketParse->SetPacketBody(GetConnectID(), &mb, App_MessageBlockManager::instance()); CheckMessage(); m_pPacketParse = new CConsolePacketParse(); Close(); //接受下一个数据包 RecvClinetPacket(m_pPacketParse->GetPacketHeadLen()); } return; }
void CProConsoleHandle::open(ACE_HANDLE h, ACE_Message_Block&) { ACE_Time_Value tvOpenBegin(ACE_OS::gettimeofday()); //初始化key值列表 m_ConsoleMessage.SetConsoleKey(App_MainConfig::instance()->GetConsoleKey()); OUR_DEBUG((LM_INFO, "[CProConsoleHandle::open] [0x%08x]Connection from [%s:%d]\n", this, m_addrRemote.get_host_addr(), m_addrRemote.get_port_number())); m_atvConnect = ACE_OS::gettimeofday(); m_atvInput = ACE_OS::gettimeofday(); m_atvOutput = ACE_OS::gettimeofday(); m_atvSendAlive = ACE_OS::gettimeofday(); m_u4AllRecvCount = 0; m_u4AllSendCount = 0; m_u4AllRecvSize = 0; m_u4AllSendSize = 0; m_blCanWrite = true; m_blTimeClose = false; m_u4RecvPacketCount = 0; m_nIOCount = 1; ACE_Time_Value tvOpenEnd(ACE_OS::gettimeofday()); ACE_Time_Value tvOpen(tvOpenEnd - tvOpenBegin); //AppLogManager::instance()->WriteLog(LOG_SYSTEM_CONNECT, "Connection from [%s:%d] DisposeTime = %d.",m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), tvOpen.msec()); this->handle(h); if(this->m_Reader.open(*this, h, 0, App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE)) == -1 || this->m_Writer.open(*this, h, 0, App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE)) == -1) { OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::open] m_reader or m_reader == 0.\n")); Close(); return; } //ACE_Sig_Action writeAction((ACE_SignalHandler)SIG_IGN); //writeAction.register_action(SIGPIPE, 0); //int nTecvBuffSize = MAX_MSG_SOCKETBUFF; //ACE_OS::setsockopt(this->get_handle(), SOL_SOCKET, SO_RCVBUF, (char* )&nTecvBuffSize, sizeof(nTecvBuffSize)); //ACE_OS::setsockopt(h, SOL_SOCKET, SO_SNDBUF, (char* )&nTecvBuffSize, sizeof(nTecvBuffSize)); m_u1ConnectState = CONNECT_OPEN; OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::open] Open(%d).\n", GetConnectID())); m_pPacketParse = new CConsolePacketParse(); if(NULL == m_pPacketParse) { OUR_DEBUG((LM_DEBUG,"[CProConsoleHandle::open] Open(%d) m_pPacketParse new error.\n", GetConnectID())); Close(); return; } RecvClinetPacket(m_pPacketParse->GetPacketHeadLen()); return; }