Exemple #1
0
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();
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}