CPipeConnectSuccResult::CPipeConnectSuccResult( int32 nPipeId, uint32 uSessionID, const CAddress& LocalAddr, const CAddress& RemoteAddr, CPipeThread* pThread) : CPipeResult(nPipeId, uSessionID) { m_szLocalAddr = CloneString(LocalAddr.GetAddress(), pThread); m_uLocalPort = LocalAddr.GetPort(); m_szRemoteAddr = CloneString(RemoteAddr.GetAddress(), pThread); m_uRemotePort = RemoteAddr.GetPort(); }
CPipeAcceptedResult::CPipeAcceptedResult(int32 nPipeId,uint32 uSessionID, int32 newPipeId, uint32 threadId, uint32 oldthreadid, IPipe* pPipe, const CAddress& LocalAddr, const CAddress& RemoteAddr, CPipeThread* pThread) :CPipeResult(nPipeId, uSessionID) { m_szLocalAddr = CloneString( LocalAddr.GetAddress(), pThread ); m_uLocalPort = LocalAddr.GetPort(); m_szRemoteAddr = CloneString( RemoteAddr.GetAddress(), pThread ); m_uRemotePort = RemoteAddr.GetPort(); m_pPipe = pPipe; m_uOldThreadId = oldthreadid; m_nNewPipeID = newPipeId; m_uThreadId = threadId; }
void CConnClient::ShutDown(const char* szMsg) { if(m_bShutting) return; m_bShutting = true; CCoreSceneMgrClient::Inst()->DestroyMainSceneIfNotBeingUsedByLogic(); CTimeSystemClient::Inst()->UnRegister(this); if (IntShutDown() && szMsg) { ostringstream strm; CAddress addr; const char* szUserName = GetValue("UserName"); szUserName = szUserName?szUserName:""; GetLocalAddress(addr); LogTime(strm); strm << " account:" << szUserName << " reason:" << szMsg << " localip:" << addr.GetAddress() << " remoteip: " << endl; LogOnOffLineMsg(strm.str().c_str()); } Inst()=NULL; }
int CPipeState_Listening::CreateBindedSocket(SOCKET& SocketOut,const CAddress& Address) { SOCKET Socket=CreateSocket(); sockaddr_in saiAddress; memset(&saiAddress,0,sizeof(saiAddress)); saiAddress.sin_addr.s_addr = inet_addr( Address.GetAddress() ); saiAddress.sin_port = htons( static_cast<u_short>( Address.GetPort() ) ); saiAddress.sin_family = AF_INET; //bind if( bind( Socket,reinterpret_cast<sockaddr*>( &saiAddress) , sizeof(sockaddr) ) ) { closesocket(Socket); return SocketGetLastError(); } SocketOut=Socket; return 0; }
CPipeState_Connecting::CPipeState_Connecting(CSyncPipe* pPipe,const CAddress& Address,uint32& uResult) :CPipeState_Busy(pPipe) { pPipe->m_OutBuffer.OutBufferClear(); pPipe->m_InBuffer.InBufferClear(); CPipeState* pState=GetPipe()->m_pState; GetPipe()->m_pState=NULL; delete pState; GetPipe()->m_pState=this; const SOCKET& Socket=m_Socket; #ifdef _WIN32 SQR_TRY { m_Event.Create(Socket); } SQR_CATCH (exp) { LogExp(exp); closesocket(m_Socket); throw; } SQR_TRY_END; #endif Register(); sockaddr_in saiAddress; ::memset(&saiAddress,0,sizeof(saiAddress)); saiAddress.sin_addr.s_addr = inet_addr(Address.GetAddress()); saiAddress.sin_port = htons(static_cast<u_short>(Address.GetPort())); saiAddress.sin_family = AF_INET; //连接 int nResult; nResult=connect(Socket,reinterpret_cast<sockaddr*>(&saiAddress),sizeof(sockaddr)); if(SOCKET_ERROR!=nResult) { uResult=0; } else { int nError=SocketGetLastError(); switch(nError) { #if defined(__linux__) case EINPROGRESS: #elif defined(_WIN32) case EWOULDBLOCK: #endif uResult=1; break; #ifdef _WIN32 case ECONNABORTED://Windows下还真会出现这种情况 case ENOBUFS: uResult=2; GetPipe()->AddEventConnectFailed(ePCFR_OSERROR); return; #endif case ECONNRESET: case ECONNREFUSED: uResult=2; GetPipe()->AddEventConnectFailed(ePCFR_REFUSED); return; case ETIMEDOUT: case ENETRESET: case EHOSTUNREACH: case ENETUNREACH: uResult=2; GetPipe()->AddEventConnectFailed(ePCFR_UNREACHABLE); return; default: closesocket(m_Socket); stringstream strm; strm<<"connect failed with error code "<<nError<<"."; GenErr(strm.str()); } } m_RemoteAddress=Address; }