TCPSocket TCPServerSocket::accept(){ if(!*this){ throw setka::Exc("TCPServerSocket::Accept(): the socket is not opened"); } this->clearCanReadFlag(); sockaddr_storage sockAddr; #if M_OS == M_OS_WINDOWS int sock_alen = sizeof(sockAddr); #elif M_OS == M_OS_LINUX || M_OS == M_OS_MACOSX || M_OS == M_OS_UNIX socklen_t sock_alen = sizeof(sockAddr); #else # error "Unsupported OS" #endif TCPSocket sock;//allocate a new socket object sock.socket = ::accept( this->socket, reinterpret_cast<sockaddr*>(&sockAddr), &sock_alen ); if(sock.socket == DInvalidSocket()){ return sock;//no connections to be accepted, return invalid socket } #if M_OS == M_OS_WINDOWS sock.createEventForWaitable(); //NOTE: accepted socket is associated with the same event object as the listening socket which accepted it. //Re-associate the socket with its own event object. sock.setWaitingEvents(0); #endif sock.setNonBlockingMode(); if(this->disableNaggle){ sock.disableNaggle(); } return sock;//return a newly created socket }