1

TCP/IP ソケットに関して、io_service の役割を理解するのに苦労しています。これが私のio_serviceの基本的な理解です。は、 への作業要求 ( を使用します)またはへの作業をio_service->run()ブロックして受け入れます。私はここで正しいですか?何か不足している場合はお知らせください。以下は、単純なサーバーのコードですio_service::workpostdispatchio_service

void RunServer()
{
    boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
    boost::shared_ptr< boost::asio::ip::tcp::acceptor > acceptor(new boost::asio::ip::tcp::acceptor( *io_service ));
    boost::shared_ptr< boost::asio::ip::tcp::socket > sock( new boost::asio::ip::tcp::socket( *io_service ) );

    try
    {
        boost::asio::ip::tcp::resolver resolver( *io_service );
        boost::asio::ip::tcp::resolver::query query( "127.0.0.1", boost::lexical_cast< std::string >( 7777 ));
        boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve( query );
        acceptor->open( endpoint.protocol() );
        acceptor->set_option( boost::asio::ip::tcp::acceptor::reuse_address( false ) );
        acceptor->bind( endpoint );
        acceptor->listen( boost::asio::socket_base::max_connections );
        acceptor->async_accept( *sock, boost::bind( OnAccept, _1, sock ) );//Receives only one connection
        std::cout << "Waiting for incoming connections \n";
        io_service->run();  //Confusion here --- Line A
    }
    catch( std::exception & ex )
    {
        std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;   
    }
}

これで、io_service に作業オブジェクトがアタッチされていない場合、メソッドio_service->run()はブロックされないことがわかりましたね。ここで私の質問は、io_service->run()上記でどのような役割を果たしているのかということです。OnAccept実験から、コードを削除するとメソッドが呼び出されないことに気付きました。また、ここに追加されている作業はどこにありますかio_service。ここで正確に何が起こっているのですか?これを明確にする説明をいただければ幸いです。

4

1 に答える 1

1

まず第一に、単純なサーバー コードは問題ないように見えます。An io_serviceis just that, サービス I/O 操作. 非同期操作におけるその役割をよりよく理解するために、Asio の解剖学を研究することは有用です。

非同期接続

すぐに戻るのio_service::workを防ぐためのオブジェクトは必要ありません。io_service::run()あなたの場合、あなたは でio_service行う作業を与えましたがasync_accept()、おそらくより多くの作業がOnAccept()別のasync_accept()呼び出しで行われます。

SO に関する同様の質問には、役立つ回答が他にもいくつかあります。

于 2013-03-21T22:37:13.370 に答える