Example #1
0
int32_t CCoreTCPListener::handle_input(BASE_HANDLER handle)
{
	while(true) //EPOLL ET模式是需要将事件全部处理干净,直到状态EAGAIN
	{
		Inet_Addr remote_addr;
		CConnection *conn = CONNECTION_POOL.pop_obj();
		conn->reset();

		if(acceptor_.accept(conn->get_sock_stream(), remote_addr, true) == 0)
		{
			CORE_INFO("accept tcp connection, remote addr = " << remote_addr);
			conn->set_remote_addr(remote_addr);

			if(REACTOR_INSTANCE()->register_handler(conn, MASK_WRITE | MASK_READ) == 0)
			{	
				conn->set_state(CConnection::CONN_CONNECTING);

				CORE_INFO("pop conn = " << conn);
			}
			else 
			{
				conn->reset();
				CONNECTION_POOL.push_obj(conn);
			}
#ifdef WIN32
			return 0;
#endif
		}
		else
		{
			conn->reset();
			CONNECTION_POOL.push_obj(conn);
#ifndef WIN32
			if (errno != EAGAIN && errno != ECONNABORTED && errno != EPROTO && errno != EINTR)
			{
				CORE_DEBUG("push conn = " << this);
				CORE_FATAL("tcp listener accept failed!");
				return -2;
			}
			else 
			{
				return 0;
			}
#else 
			return -2;
#endif
		}
	}

	return 0;
}