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; }
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); } }
//主动连接服务器,返回该连接的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; }
//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(); }