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 } } } }