bool ConnectorManager_Client::ConnectToServer(const char* ip, uint16_t port, ConnectorID_t &ConnectorID) { int ret = 0; int step = 0; bool bRemove = false; Connector *pConnector = m_pConnectorPool->NewConnector(); if (pConnector == NULL) return false; Socket* pSocket = pConnector->GetSocket(); _NET_TRY { ret = pSocket->create_socket(); if(!ret) { step = 1; goto EXCEPTION; } ret = pSocket->connect_socket(ip, port); if(!ret) { step = 2; goto EXCEPTION; } ret = pSocket->setNonBlocking(); if(!ret) { step = 3; goto EXCEPTION; } ret = pSocket->setLinger(0); if(!ret) { step = 4; goto EXCEPTION; } ret = AddConnector(pConnector); if(!ret) { step = 6; goto EXCEPTION; } bRemove = true; NET::ConnecterState(pConnector->GetConnectorID(), NET::ConnecterConnect); } _NET_CATCH { step = 5; goto EXCEPTION; } WriteLog(KERN_INFO "ServerConnectorManager::ConnectToServer(): Success ! IP:%s Port:%d", ip, port ); ConnectorID = pConnector->GetConnectorID(); return true; EXCEPTION: WriteLog(KERN_ERR "ClientConnectorManager::ConnectToServer(): Fail ! IP:%s Port:%d,Step:%d", ip, port, step ); if( bRemove ) { RemoveConnector(pConnector); } else { m_pConnectorPool->DelConnector(pConnector->GetConnectorID()); } return false; }
bool ConnectorManager_Client::Handle_Inputs() { try { m_nEvents = epoll_wait(m_Epollfd, events, m_uEventsMaxSize, 0); if(m_nEvents > m_uEventsMaxSize || m_nEvents < 0) { WriteLog(KERN_ERR "epoll wait Error ! m_nEvents=%d", m_nEvents); } } catch(...) { WriteLog(KERN_ERR "ConnectorManager_Client::epoll_wait(): Error ! m_nEvents=%d", m_nEvents); } bool ret = false; for(int i = 0; i < m_nEvents; i++) { int32_t SockFD = GetHighSection(events[i].data.u64); ConnectorID_t idx = GetLowSection(events[i].data.u64); if(SockFD == m_SocketID) { if( m_bServerMode ) { for(int32_t i = 0; i < ACCEPT_ONESTEP; i++) { if(AcceptNewConnection()==NULL) break; } } } else if( events[i].events & EPOLLIN ) { Connector* pConnector = GetConnector(idx); if( pConnector == NULL ) { WriteLog(KERN_ERR "ConnectorManager_Epoll::ProcessInputs(): Error ! pConnector==NULL,id=%d", idx ); continue; } if( pConnector->IsDisconnect() ) continue; int fd = pConnector->GetSocket()->getFD(); if(fd == INVALID_SOCKET) { WriteLog(KERN_ERR "ConnectorManager_Epoll::ProcessInputs(): Error ! socket==INVALID" ); continue; } if(pConnector->GetSocket()->isSockError()) { RemoveConnector(pConnector); } else { _NET_TRY { ret = pConnector->Handle_Input(); if(!ret) { RemoveConnector(pConnector); } } _NET_CATCH { RemoveConnector(pConnector); } } } }
Connector* ConnectorManager_Client::AcceptNewConnection() { if(m_bServerMode == false) return NULL; int32_t step = 0; bool ret = false; bool bRemove = false; Connector* pConnector = NULL; _NET_TRY { pConnector = m_pConnectorPool->NewConnector(); if( pConnector == NULL ) { WriteLog(KERN_ERR "ConnectorManager::AcceptNewConnection(): Fail ! New Connector Fail" ); return NULL; } ret = m_pServerSocket->accept_socket(pConnector->GetSocket()); if(!ret) { m_pConnectorPool->DelConnector(pConnector->GetConnectorID()); return NULL; } } _NET_CATCH { step += 1000; goto EXCEPTION; } _NET_TRY { Socket* pSocket = pConnector->GetSocket(); if(pSocket->getFD() == INVALID_SOCKET ) { step = 2; goto EXCEPTION; } ret = pSocket->setNonBlocking(); if(!ret) { step = 3; goto EXCEPTION; } ret = pSocket->setLinger(0); if(!ret) { step = 4; goto EXCEPTION; } step = 5; ret = AddConnector(pConnector); if(!ret) { goto EXCEPTION; } bRemove = true; NET::ConnecterState(pConnector->GetConnectorID(), NET::ConnecterConnect); } _NET_CATCH { step += 10000; goto EXCEPTION; } WriteLog(KERN_INFO "ServerConnectorManager::ConnectToServer(): Success ! sock=%d,pid=%d,ip=%s", pConnector->GetSocket()->getSOCKET(), pConnector->GetConnectorID(), pConnector->GetSocket()->getIP() ); return pConnector; EXCEPTION: WriteLog(KERN_ERR "ClientConnectorManager::ConnectToServer(): Fail ! IP:%s Port:%d,Step:%d", pConnector->GetSocket()->getSOCKET(), pConnector->GetConnectorID(), pConnector->GetSocket()->getIP() ); if( pConnector != NULL ) { if( bRemove ) RemoveConnector(pConnector); else m_pConnectorPool->DelConnector(pConnector->GetConnectorID()); } return NULL; }