Example #1
0
void CServer::main_loop()
{
	::log.info( "Server started" );
	for(;;)
	{
		for (int i = 0; i <  clients.size(); i++)
		{
			if( clients[i]->is_close_requested() )
			{
				::log.info( "Process Close" );
				clients[i]->on_close();
			}
			if( clients[i]->is_closed() ) 
			{
				::log.info( "Remove Client " );
				clients.erase( clients.begin() + i );
			}
		}
		int c[clients.size()];
		for (int i = 0; i < clients.size(); i++)
		{
			c[i] = clients[i]->get_socket().get_socket();
		}
		selector.fill_fds(c, clients.size(), NULL, 0);
		selector.select();
				
		if( selector.is_acceptable(0) )
		{
			//onaccept
			CSocket *sck = server.accept();
			sck->_register( selector, CSelector::OP_READ );
			CConnection *con = new TRConnection( *sck, selector );
			clients.push_back( con );
			con->on_accept();
		}
		for( int i = 0; i < clients.size(); i++ )
		{			
			if( !clients[i]->get_socket().get_socket() )
				continue;
			if( selector.is_readable( clients[i]->get_socket().get_socket() ) )
			{
				//onread				
				//packet::CPacketBuffer pbRead(8192);
				//clients[i]->get_socket().read(pbRead);
				//TODO:
				// call the on_read method of the appropiate, Connection class				
				//on_read(clients[i]->get_socket(), pbRead);
				string s;
                s = "Read from client ";
                s += clients[i]->get_ip();
				::log.info(s.c_str());
				
				clients[i]->on_read();
				
			}
			if( selector.is_writeable( clients[i]->get_socket().get_socket() ))
			{
				//onwrite
				
			}
		}
		
	}

}