bool CHahsEngine::AddUdpConn(const CSockAddr & bindAddr, const CSockAddr & connectAddr, const CRecvHelper & recvHelper) { typedef CSharedPtr<CUdpSocket, false> __FileGuard; LOCAL_LOGGER(logger, "CHahsEngine::AddUdpConn"); DEBUG("bindAddr="<<bindAddr.ToString()<<", connectAddr="<<connectAddr.ToString()<<", recvHelper=@"<<&recvHelper); __FileGuard file = dynamic_cast<__FileGuard::pointer>(IFileDesc::GetObject(FD_UDP)); if(!file){ ERROR("cannot get file object for connectAddr="<<connectAddr.ToString()); return false; } if(bindAddr.IsValid()){ if(!file->Bind(bindAddr)){ ERROR("cannot bind addr="<<bindAddr.ToString()<<IFileDesc::ErrMsg()); return false; } } if(connectAddr.IsValid()){ if(!file->Connect(connectAddr)){ ERROR("cannot connect addr="<<connectAddr.ToString()<<IFileDesc::ErrMsg()); return false; } } if(!file->SetBlock(false)){ ERROR("set non-blocking failed for file="<<Tools::ToStringPtr(file)); return false; } DEBUG("file="<<Tools::ToStringPtr(file)); __SockPtr sock = CSockSession::GetObject(&*file, recvHelper); if(!sock){ ERROR("cannot get sock session for file="<<Tools::ToStringPtr(file)); return false; } file.release(); return addSock(sock, EVENT_IN); //根据sock的处理步骤决定 }
bool CHahsEngine::AddTcpListen(const CSockAddr & bindAddr, const CRecvHelper & recvHelper) { typedef CSharedPtr<CListenSocket, false> __FileGuard; LOCAL_LOGGER(logger, "CHahsEngine::AddTcpListen"); assert(bindAddr.IsValid()); DEBUG("bindAddr="<<bindAddr.ToString()<<", recvHelper=@"<<&recvHelper); __FileGuard file = dynamic_cast<__FileGuard::pointer>(IFileDesc::GetObject(FD_TCP_LISTEN)); if(!file){ ERROR("cannot get file object for bindAddr="<<bindAddr.ToString()); return false; } if(!file->Listen(bindAddr, false)){ ERROR("cannot listen bindAddr="<<bindAddr.ToString()<<IFileDesc::ErrMsg()); return false; } if(!file->SetBlock(false)){ ERROR("set non-blocking failed for file="<<Tools::ToStringPtr(file)); return false; } TRACE("file="<<Tools::ToStringPtr(file)); __SockPtr sock = CSockSession::GetObject(&*file, recvHelper); if(!sock){ ERROR("cannot get sock session for file="<<Tools::ToStringPtr(file)); return false; } file.release(); return addSock(sock, EVENT_IN); }
int main(int argc, char **argv) { int ret; int clientSock; int size; char buf[1024]; char prefix[32]; int i; int n; socklen_t len; struct sockaddr_in clientAddr; if(initSock(8000) < 0) return -1; while(1) { n = mSelect(); if(FD_ISSET(socks[0], &rfds)) { size = sizeof(clientAddr); clientSock = accept(socks[0], (struct sockaddr *)&clientAddr, &size); if(clientSock < 0) { perror("Accept failed"); continue; } addSock(clientSock); } for(i=1; i<=maxNum; i++) { if(socks[i] == -1) continue; if(FD_ISSET(socks[i], &rfds)) { size = recv(socks[i], buf, 1023, 0); if(size < 0) { if(errno == ECONNRESET) removeSock(i); else perror("recv error"); } else if(size == 0) { removeSock(i); } getpeername(socks[i], (struct sockaddr *)&clientAddr, &len); char *ip = inet_ntoa(clientAddr.sin_addr); sprintf(prefix, "[%s]:", ip); sendMsg(prefix, strlen(prefix)); sendMsg(buf, size); } } } close(socks[0]); return 0; }