int fetcher_handler::handle_output(ACE_HANDLE fd) { ACE_Message_Block *mb = NULL; ACE_Time_Value nowait(ACE_OS::gettimeofday()); ACE_DEBUG((LM_DEBUG, "fetcher_handler::handle_output for %d\n", fd)); while (-1 != this->getq(mb, &nowait)) { ssize_t send_cnt = this->peer().send(mb->rd_ptr(), mb->length()); ACE_DEBUG((LM_DEBUG, "fetcher_handler: sent %d bytes\n", send_cnt)); if (send_cnt == -1) ACE_ERROR((LM_ERROR, "(%P|%t) %p\n", "fetcher_handler::send")); else mb->rd_ptr (static_cast<size_t>(send_cnt)); if (mb->length() > 0) { this->ungetq (mb); break; } mb->release (); } if (this->msg_queue ()->is_empty ()) this->reactor()->cancel_wakeup(this, ACE_Event_Handler::WRITE_MASK); else this->reactor()->schedule_wakeup(this, ACE_Event_Handler::WRITE_MASK); return 0; }
int CConnectClient::open(void* p) { //从配置文件获取数据 m_u4MaxPacketSize = App_MainConfig::instance()->GetRecvBuffSize(); if (p != NULL) { OUR_DEBUG((LM_ERROR, "[CConnectClient::open]p is not NULL.\n")); } ACE_Time_Value nowait(MAX_MSG_PACKETTIMEOUT); m_nIOCount = 1; int nRet = Super::open(); if (nRet != 0) { OUR_DEBUG((LM_ERROR, "[CConnectClient::open]ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>::open() error [%d].\n", nRet)); sprintf_safe(m_szError, MAX_BUFF_500, "[CConnectClient::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, "[CConnectHandler::open]this->peer().enable = ACE_NONBLOCK error.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConnectClient::open]this->peer().enable = ACE_NONBLOCK error."); return -1; } //获得远程链接地址和端口 if (this->peer().get_remote_addr(m_addrRemote) == -1) { OUR_DEBUG((LM_ERROR, "[CConnectHandler::open]this->peer().get_remote_addr error.\n")); sprintf_safe(m_szError, MAX_BUFF_500, "[CConnectClient::open]this->peer().get_remote_addr error."); return -1; } m_u4SendSize = 0; m_u4SendCount = 0; m_u4RecvSize = 0; m_u4RecvCount = 0; m_u4CostTime = 0; m_atvBegin = ACE_OS::gettimeofday(); m_u4CurrSize = 0; //申请当前的MessageBlock m_pCurrMessage = App_MessageBlockManager::instance()->Create(App_MainConfig::instance()->GetConnectServerRecvBuffer()); if (m_pCurrMessage == NULL) { OUR_DEBUG((LM_ERROR, "[CConnectClient::RecvClinetPacket] pmb new is NULL.\n")); return -1; } App_ClientReConnectManager::instance()->SetHandler(m_nServerID, this); m_pClientMessage = App_ClientReConnectManager::instance()->GetClientMessage(m_nServerID); OUR_DEBUG((LM_INFO, "[CConnectClient::open] Connection from [%s:%d]\n", m_addrRemote.get_host_addr(), m_addrRemote.get_port_number())); return 0; }
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; }
//接受数据 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 CConnectClient::SendData(ACE_Message_Block* pmblk) { //如果是DEBUG状态,记录当前接受包的二进制数据 if (App_MainConfig::instance()->GetDebug() == DEBUG_ON) { char szDebugData[MAX_BUFF_1024] = {'\0'}; char szLog[10] = {'\0'}; int nDebugSize = 0; bool blblMore = false; if (pmblk->length() >= MAX_BUFF_200) { nDebugSize = MAX_BUFF_200; blblMore = true; } else { nDebugSize = (int)pmblk->length(); } char* pData = pmblk->rd_ptr(); for (int i = 0; i < nDebugSize; i++) { sprintf_safe(szLog, 10, "0x%02X ", (unsigned char)pData[i]); sprintf_safe(szDebugData + 5 * i, MAX_BUFF_1024 - 5 * i, "%s", szLog); } if (blblMore == true) { AppLogManager::instance()->WriteLog(LOG_SYSTEM_DEBUG_CLIENTRECV, "[%s:%d]%s.(数据包过长只记录前200字节)", m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), szDebugData); } else { AppLogManager::instance()->WriteLog(LOG_SYSTEM_DEBUG_CLIENTRECV, "[%s:%d]%s.", m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), szDebugData); } } ACE_Time_Value nowait(MAX_MSG_PACKETTIMEOUT); if (NULL == pmblk) { OUR_DEBUG((LM_ERROR, "[CConnectClient::SendData] ConnectID = %d, get_handle() == ACE_INVALID_HANDLE.\n", GetServerID())); return false; } if (get_handle() == ACE_INVALID_HANDLE) { OUR_DEBUG((LM_ERROR, "[CConnectClient::SendData] ConnectID = %d, get_handle() == ACE_INVALID_HANDLE.\n", GetServerID())); sprintf_safe(m_szError, MAX_BUFF_500, "[CConnectClient::SendData] ConnectID = %d, get_handle() == ACE_INVALID_HANDLE.\n", GetServerID()); pmblk->release(); return false; } char* pData = pmblk->rd_ptr(); if (NULL == pData) { OUR_DEBUG((LM_ERROR, "[CConnectClient::SendData] ConnectID = %d, pData is NULL.\n", GetServerID())); pmblk->release(); return false; } int nSendLen = (int)pmblk->length(); //发送数据的总长度 int nIsSendSize = 0; //循环发送,直到数据发送完成。 while (true) { if (nSendLen <= 0) { OUR_DEBUG((LM_ERROR, "[CConnectClient::SendData] ConnectID = %d, nCurrSendSize error is %d.\n", GetServerID(), nSendLen)); pmblk->release(); return false; } int nDataLen = this->peer().send(pmblk->rd_ptr(), nSendLen - nIsSendSize, &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; } _ClientIPInfo objServerIPInfo; sprintf_safe(objServerIPInfo.m_szClientIP, MAX_BUFF_20, "%s", m_addrRemote.get_host_addr()); objServerIPInfo.m_nPort = m_addrRemote.get_port_number(); m_pClientMessage->ConnectError((int)ACE_OS::last_error(), objServerIPInfo); OUR_DEBUG((LM_ERROR, "[CConnectClient::SendData] ConnectID = %d, error = %d.\n", GetServerID(), errno)); pmblk->release(); return false; } else if (nDataLen + nIsSendSize >= nSendLen) //当数据包全部发送完毕,清空。 { //OUR_DEBUG((LM_ERROR, "[CConnectHandler::handle_output] ConnectID = %d, send (%d) OK.\n", GetConnectID(), msg_queue()->is_empty())); pmblk->release(); m_u4SendSize += (uint32)nSendLen; m_u4SendCount++; return true; } else { pmblk->rd_ptr(nDataLen); nIsSendSize += nDataLen; continue; } } return true; }
int CConnectClient::RecvData() { ACE_Time_Value nowait(MAX_MSG_PACKETTIMEOUT); int nCurrCount = (uint32)m_pCurrMessage->size(); if (nCurrCount < 0) { //如果剩余字节为负,说明程序出了问题 OUR_DEBUG((LM_ERROR, "[CConnectClient::handle_input][%d] nCurrCount < 0 m_u4CurrSize = %d.\n", GetServerID(), m_u4CurrSize)); m_u4CurrSize = 0; if (NULL != m_pClientMessage) { _ClientIPInfo objServerIPInfo; sprintf_safe(objServerIPInfo.m_szClientIP, MAX_BUFF_20, "%s", m_addrRemote.get_host_addr()); objServerIPInfo.m_nPort = m_addrRemote.get_port_number(); if(S2S_NEED_CALLBACK == m_ems2s) { m_pClientMessage->ConnectError((int)ACE_OS::last_error(), objServerIPInfo); } } 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, "[CConnectClient::handle_input] ConnectID = %d, recv data is error nDataLen = [%d] errno = [%d].\n", GetServerID(), nDataLen, u4Error)); sprintf_safe(m_szError, MAX_BUFF_500, "[CConnectClient::handle_input] ConnectID = %d, recv data is error[%d].\n", GetServerID(), nDataLen); if (NULL != m_pClientMessage) { _ClientIPInfo objServerIPInfo; sprintf_safe(objServerIPInfo.m_szClientIP, MAX_BUFF_20, "%s", m_addrRemote.get_host_addr()); objServerIPInfo.m_nPort = m_addrRemote.get_port_number(); if(S2S_NEED_CALLBACK == m_ems2s) { m_pClientMessage->ConnectError((int)ACE_OS::last_error(), objServerIPInfo); } } return -1; } //如果是DEBUG状态,记录当前接受包的二进制数据 if (App_MainConfig::instance()->GetDebug() == DEBUG_ON) { char szDebugData[MAX_BUFF_1024] = {'\0'}; char szLog[10] = {'\0'}; int nDebugSize = 0; bool blblMore = false; if (nDataLen >= MAX_BUFF_200) { nDebugSize = MAX_BUFF_200; blblMore = true; } else { nDebugSize = nDataLen; } char* pData = m_pCurrMessage->wr_ptr(); for (int i = 0; i < nDebugSize; i++) { sprintf_safe(szLog, 10, "0x%02X ", (unsigned char)pData[i]); sprintf_safe(szDebugData + 5 * i, MAX_BUFF_1024 - 5 * i, "%s", szLog); } if (blblMore == true) { AppLogManager::instance()->WriteLog(LOG_SYSTEM_DEBUG_SERVERRECV, "[%s:%d]%s.(数据包过长只记录前200字节)", m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), szDebugData); } else { AppLogManager::instance()->WriteLog(LOG_SYSTEM_DEBUG_SERVERRECV, "[%s:%d]%s.", m_addrRemote.get_host_addr(), m_addrRemote.get_port_number(), szDebugData); } } m_pCurrMessage->wr_ptr(nDataLen); if (NULL != m_pClientMessage) { //接收数据,返回给逻辑层,自己不处理整包完整性判定 _ClientIPInfo objServerIPInfo; sprintf_safe(objServerIPInfo.m_szClientIP, MAX_BUFF_20, "%s", m_addrRemote.get_host_addr()); objServerIPInfo.m_nPort = m_addrRemote.get_port_number(); m_pClientMessage->RecvData(m_pCurrMessage, objServerIPInfo); } m_pCurrMessage->reset(); return 0; }