Exemplo n.º 1
0
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
}