Example #1
0
TInt32 CListener::Run(TInt32 cnt)
{
    TInt32 usedCnt = HasNewConnection();
    SOCKET acceptedSocket = SOCKET_ERROR;
    int nLen = sizeof(SOCKADDR_IN);
    for (int i =0;i<usedCnt;++i)
    {
        acceptedSocket = WSAAccept(m_listeningSocket,
            NULL,
            &nLen,0,0);
        if (SOCKET_ERROR != acceptedSocket)
        {
//             TInt32 ret = SetSocketOptions(acceptedSocket);
//             if (SUCCESS > ret)
//             {
//                 closesocket(ret);
//                 continue;
//             }
            TInt32 result = SetSocketOptions(acceptedSocket);
            if (SUCCESS > result)
            {
                closesocket(acceptedSocket);
                continue;
            }
            
            
            CConnection *pNew = m_pConnectionPool->GetItem();
            if (!pNew)
            {
                closesocket(acceptedSocket);
                return usedCnt;
            }
            CConPair pair;
            GetConnPair(acceptedSocket,pair);
            IfConnectionCallBack *pAppCallBack = m_pListenerCallBack->OnNewConnection(&pair);
            if (!pAppCallBack)
            {
                closesocket(acceptedSocket);
                continue;
            }
            IfParser  *pParser;
            if (m_pParserFactory)
            {
                pParser = m_pParserFactory->GetParser(&pair,pNew->GetConnectionIdx());
            }
            else
            {
                pParser = NULL;
            }
            IfCryptor *pCryptor;
            if (m_pCryptorFactory)
            {
                 pCryptor = m_pCryptorFactory->GetCryptor(&pair,pNew->GetConnectionIdx());
            }
            else
            {
                pCryptor = NULL;
            }
			pNew->SetConnectionType(connection_is_postive);
            TInt32 ret = pNew->Init(acceptedSocket,&pair,pAppCallBack,pParser,pCryptor);
            if (SUCCESS > ret)
            {
				pAppCallBack->OnDissconneted(ret);
                pNew->CloseConnection();
                m_pConnectionPool->ReleaseItem(pNew);
                continue;
            }
            HANDLE h = CreateIoCompletionPort((HANDLE) acceptedSocket, m_compeltionPort, (ULONG_PTR)(pNew), 0);

            if (h != m_compeltionPort)
            {
				pAppCallBack->OnDissconneted(ret);
                pNew->OnDisconnected();
                m_pConnectionPool->ReleaseItem(pNew);
                continue;
            }
            
            ret = pNew->OnConnected();
            if (SUCCESS > ret)
            {
				pAppCallBack->OnDissconneted(ret);
                pNew->CloseConnection();
                m_pConnectionPool->ReleaseItem(pNew);
                continue;
            }
        }
    }
    return usedCnt;
}