/// Accept handler void Acceptor::accept( const boost::system::error_code& aError ) { LOG_DEBUG("Acceptor::accept()"); // if the accept had an error, forget it if ( aError ) { LOG_ERROR("Acceptor : Error occured!"); return; } // process the socket mConnection->listen(); LOG_DEBUG("Acceptor : listen returned."); // forget the connection, create a new one mConnection = mCreator(); LOG_DEBUG("Acceptor : creator returned."); // ... and asynchronously wait for an accept again mAcceptor.async_accept( mConnection->getSocket(), boost::bind( &Acceptor::accept, this, boost::asio::placeholders::error ) ); LOG_DEBUG("Acceptor : async accept returned returned."); }
Acceptor::Acceptor( boost::asio::io_service& aIOS, const std::string& aAddress, const std::string& aPort, Creator aCreator ) : mAcceptor( aIOS ), mCreator( aCreator ) { // create a resolver, and resolve the address boost::asio::ip::tcp::resolver iResolver( aIOS ); boost::asio::ip::tcp::resolver::query iQuery( aAddress, aPort ); boost::asio::ip::tcp::endpoint iResult = *iResolver.resolve( iQuery ); // prepare the acceptor mAcceptor.open( iResult.protocol() ); mAcceptor.set_option( boost::asio::ip::tcp::acceptor::reuse_address(true) ); mAcceptor.bind( iResult ); // start listening mAcceptor.listen(); // create first connection mConnection = mCreator(); // asynchronously accept on our first worker, if succeeded, run accept mAcceptor.async_accept( mConnection->getSocket(), boost::bind( &Acceptor::accept, this, boost::asio::placeholders::error ) ); // note that this wont happen yet, because there's no io_service running }
Port* DelegateService::bindODPPort(const SpaceObjectReference& sor, PortID port) { PortMap* pm = getOrCreatePortMap(sor); PortMap::iterator it = pm->find(port); if (it != pm->end()) { // Already allocated return NULL; } DelegatePort* new_port = mCreator(this, sor, port); if (new_port != NULL) { (*pm)[port] = new_port; } return new_port; }