1

ブーストasioから始めて、オンラインで見つけた単純なサーバーのコードスニペットを操作しました。ここにコードがあります

void OnAccept( const boost::system::error_code & ec, boost::shared_ptr< boost::asio::ip::tcp::socket > sock )
{
    if( ec )
    {
        std::cout << "[" << boost::this_thread::get_id()<< "] Error: " << ec << std::endl;  
    }
    else
    {
        std::cout << "[" << boost::this_thread::get_id()<< "] Accepted!" << std::endl;
    }
}

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";
        while(true)
        {
          Sleep(400);
        }
    }
    catch( std::exception & ex )
    {
        std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;   
    }
}


int main( int argc, char * argv[] )
{
    boost::thread server(RunServer);
    std::cout << "Press any key to stop..\n";
    std::cin.get();
    return 0;
}

残念ながら、コードは接続を受け入れていません。試してみtelnet localhost 7777ましたが、接続を受け付けません。何か提案はありますか?

4

1 に答える 1

3

非同期受け入れを開始していますが、io_service実行を許可していません。同期 acecpt を実行するか、 call を呼び出す必要がありますio_service->run()。関連する部分は次のようになります。

    std::cout << "Waiting for incoming connections \n";
    io_service->run();
}

Daytime.2 - 同期 TCP デイタイム サーバーDaytime.3 - 非同期 TCP デイタイム サーバーを比較することをお勧めします。

于 2013-03-21T19:26:54.090 に答える