virtual int ReadData(int fd) { int err = 0; int clientFd = -1; std::string ip; int port = 0; do { err = mListenSocket->Accept(clientFd, ip, port); if (0 != err) { break; } TcpSocket *clientSocket = new TcpSocket(); err = clientSocket->Create(clientFd); if (0 != err) { break; } debug_log("accpeter accept client " << ip << ":" << port); clientSocket->SetAddr(ip, port); AcceptContext *ctx = new AcceptContext(clientSocket); mNetService->Enqueue(ctx); OperContext::DecRef(ctx); } while(0); return 0; }
Socket::Status TcpListener::Accept(TcpSocket& socket) { if (GetHandle() == be::SocketBE::invalidSocket()) { return Error; } sockaddr_in address; be::SocketBE::AddrLength length = sizeof(address); SocketHandle remote = ::accept(GetHandle(), reinterpret_cast<sockaddr*>(&address), &length); if (remote == be::SocketBE::invalidSocket()) return be::SocketBE::getErrorStatus(); socket.Close(); socket.Create(remote); return Done; }
Socket::Status TcpListener::Accept(TcpSocket& socket) { // Make sure that we're listening if (GetHandle() == priv::SocketImpl::InvalidSocket()) { Err() << "Failed to accept a new connection, the socket is not listening" << std::endl; return Error; } // Accept a new connection sockaddr_in address; priv::SocketImpl::AddrLength length = sizeof(address); SocketHandle remote = accept(GetHandle(), reinterpret_cast<sockaddr*>(&address), &length); // Check for errors if (remote == priv::SocketImpl::InvalidSocket()) return priv::SocketImpl::GetErrorStatus(); // Initialize the new connected socket socket.Close(); socket.Create(remote); return Done; }