ClientSocket* ServerSocket::Accept() {
	ClientSocket* client = AllocClient();
	uv_tcp_init(getSocket()->loop, client->getSocket());
	if(uv_accept((uv_stream_t*)getSocket(), (uv_stream_t*) client->getSocket()) == 0) {
		client->getSocket()->data = client;
		OnConnection(client);
	}
	  else {
		OnError("Accepting Client");
        client->Close();
    }
	return client;
}
示例#2
0
void Proxy_AcceptTcpHandler(aeEventLoop*el,int fd,void*privdata,int mask)
{
    int cport,cfd;
    char cip[128];
    cfd=anetTcpAccept(anet_error,fd,cip,&cport);
    if(cfd==AE_ERR){
	LogError("accept client connection failed:%s",anet_error);
	return;
    }
    LogInfo("Accept client from:%s:%d\n",cip,cport);

    proxy_client*c=AllocClient(cfd);

    if(c==NULL||aeCreateFileEvent(el,cfd,AE_READABLE,ReadIncome,c)==AE_ERR){
	LogError("Create event failed");
	FreeClient(c);
    }
}
示例#3
0
//主动连接服务器,返回该连接的ID
//返回-1,表示失败
long CServer::Connect(LPCTSTR lpszHostAddress, UINT nHostPort,long lFlag,ulong dwTimeOut)
{
    if(!(m_bMode&1))	return -1;

    CServerClient* pConClient = AllocClient(false);
    if(pConClient == NULL)	return -1;

    if( !pConClient->CreateEx(0,NULL,SOCK_STREAM) )
    {
        PutErrorString(NET_MODULE,"%-15s Create socket bound to %s:%u FAILED, ERR_ID: %d.",__FUNCTION__, lpszHostAddress, nHostPort, GetLastError());
        return -1;
    }

    pConClient->SetFlag(lFlag);
    //设置编号
    pConClient->SetSendRevBuf();
    //设置套接字选项
    pConClient->SetSocketOpt();

    long lID = pConClient->GetIndexID();

    pConClient->SetClose(false);
    pConClient->SetShutDown(false);

    pConClient->SetParam(false,0xFFFFFFF,m_lConMaxBlockSendMsgNum,
                         m_lConPendingWrBufNum,m_lConPendingRdBufNum,
                         m_lConMaxSendSizePerSecond,m_lConMaxRecvSizePerSecond,lFlag);

    if( !Connect(pConClient,lpszHostAddress,nHostPort,dwTimeOut) )
    {
        pConClient->Close();
        FreeClient(pConClient);
        return -1;
    }

    tagSocketOper* pSocketOpera = AllocSockOper();
    pSocketOpera->Init(SCOT_Init,lID,pConClient,0);
    m_SocketOperaCommands.Push_Back(pSocketOpera);

    return lID;
}
示例#4
0
//Server工作在完成端口模式下时,使用该方法代替OnAccept
void CServer::OnAccept(int nErrorCode)
{

    char strInfo[256]="";
    SOCKET clientSocket;
    struct sockaddr_in stClientAddress;
    int nClientAddressLen=sizeof(stClientAddress);

    clientSocket = WSAAccept (m_hSocket,
                              (struct sockaddr*)&stClientAddress,
                              &nClientAddressLen,
                              NULL,
                              0);

    if(clientSocket==INVALID_SOCKET)
    {
        ulong dwEorror = WSAGetLastError();
        return;
    }

    //判断是否超过最大连接数
    if(m_lCurClientCount >= m_lMaxClientConNum)
    {
        closesocket(clientSocket);
        PutTraceString(NET_MODULE,"the cur connect num(%d) greater the restrict num(%d)",m_lCurClientCount,m_lMaxClientConNum);

        return;
    }

    //察看此IP是否被禁止
    if(m_bCheck && FindForbidIP(stClientAddress.sin_addr.S_un.S_addr) == true)
    {
        closesocket(clientSocket);
        Log4c::Warn(NET_MODULE,"the ip address(%d) has already forbided",stClientAddress.sin_addr.S_un.S_addr);
        return;
    }

    //生成
    CServerClient* pServerClient=  AllocClient(true);
    if(NULL == pServerClient)
    {
        Log4c::Warn(NET_MODULE,"erro, Don't allocate the 'serverclient' instance.!");
        closesocket(clientSocket);
        return;
    }

    pServerClient->m_hSocket=clientSocket;
    pServerClient->SetFlag(GetFlag());
    /// 设置加解密所用Key.
    static bool bFirst = true;
    if (IsEncryptType(pServerClient->GetFlag()))
    {
        if (bFirst)
        {
            bFirst = false;
            struct sockaddr_in addr;
            int len = sizeof(addr);
            getsockname(clientSocket, (struct sockaddr *)&addr, &len);
            SetKey(addr.sin_addr.S_un.S_addr, addr.sin_port);
        }
        pServerClient->GetKn(m_kn);
    }

    //设置IP
    pServerClient->SetPeerIP(inet_ntoa(stClientAddress.sin_addr));
    pServerClient->SetPeerIP(stClientAddress.sin_addr.S_un.S_addr);
    pServerClient->SetPeerPort(stClientAddress.sin_port);
    pServerClient->SetParam(GetCheck(),GetMaxMsgLen(),m_lMaxBlockSendMsgNum,
                            m_lPendingWrBufNum,m_lPendingRdBufNum,
                            m_lMaxSendSizePerSecond,m_lMaxRecvSizePerSecond,0);
    pServerClient->SetClose(false);
    pServerClient->SetShutDown(false);

    //设置Socket的indexID
    pServerClient->SetSendRevBuf();
    //设置套接字选项
    pServerClient->SetSocketOpt();

    tagSocketOper *pSocketOper = AllocSockOper();
    pSocketOper->Init(SCOT_Init,pServerClient->GetIndexID(),pServerClient);
    m_SocketOperaCommands.Push_Back(pSocketOper);

    pServerClient->OnAccept();

    IncAcceptThreadTick();
}