2012-02-19 12 views
3

私は3番目(第3人)のゲームを開発しており、私はそれをTCPソケットを使ってマルチプレイヤーにしようとしています。私はこのためにブーストasioライブラリを使用している、と私は少し頭の中です。私はチュートリアルとサンプルを使って、boost asioのdocページで少し演奏しました。コンパイル/実行/正常に動作しました。すべての仕組みがちょっと混乱しています。ブーストAsio - サーバーはメッセージを受け取りません

今は、サーバーがクライアントからのメッセージを受け取り、受信後にメッセージを印刷しようとしています。下のコードを実行すると(コンパイル/リンク/正常に実行されます)、何も起こりません。具体的には、クライアントはメッセージを正常に送信したように見え、サーバーはメッセージを受信したことはありません。

クライアントコード:

ClientFramework::ClientFramework() : 
    mResolver(mIOService) 
{ 
} 

bool ClientFramework::Initialize() 
{ 
    try 
    { 
     tcp::resolver::query query("localhost", "daytime"); 
     tcp::resolver::iterator it = mResolver.resolve(query); 
     tcp::socket socket(mIOService); 
     boost::asio::connect(socket, it); 

     std::string s = "hello world"; 
     boost::system::error_code e; 
     socket.write_some(boost::asio::buffer(s.c_str(), s.size()), e); 

     if (e) 
     { 
      throw boost::system::system_error(e); 
     } 
    } catch (std::exception& e) 
    { 
     gLog << LOG_ERROR << e.what() << "\n"; 
    } 

    return true; 
} 

Serverコード:

ServerFramework::ServerFramework() : 
    mAcceptor(mIOService, tcp::endpoint(tcp::v4(), 13)) 
{ 
} 

bool ServerFramework::Initialize() 
{ 
    mIOService.run(); 
    StartAccept(); 

    return true; 
} 

void ServerFramework::StartAccept() 
{ 
    Connection::ptr conn = 
     Connection::create(mAcceptor.get_io_service()); 
    mAcceptor.async_accept(conn->Socket(), 
     boost::bind(&ServerFramework::HandleAccept, this, conn, 
      boost::asio::placeholders::error)); 
} 

void ServerFramework::HandleAccept(Connection::ptr conn, 
    const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
     conn->Initialize(); 
    } 

    StartAccept(); 
} 

Connection::ptr Connection::create(boost::asio::io_service& io_service) 
{ 
    return ptr(new Connection(io_service)); 
} 

tcp::socket& Connection::Socket() 
{ 
    return mSocket; 
} 

void Connection::Initialize() 
{ 
    boost::asio::async_read(mSocket, boost::asio::buffer(buf, BUFFER_SIZE), 
     boost::bind(&Connection::handle_read, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
} 

Connection::Connection(boost::asio::io_service& io_service) : 
    mSocket(io_service) 
{ 
} 

void Connection::handle_read(const boost::system::error_code& e, size_t size) 
{ 
    std::string s(buf, size); 
    gLog << LOG_INFO << s << "\n"; 

    boost::asio::async_read(mSocket, boost::asio::buffer(buf, BUFFER_SIZE), 
     boost::bind(&Connection::handle_read, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
} 

答えて

4

それはあなたのio_serviceようには見えませんが、あなたがrun()を起動するときに実行するすべての作業があります。

bool ServerFramework::Initialize() 
{ 
    mIOService.run(); // <-- you don't check the return value here 
    StartAccept(); 

    return true; 
} 

それは、number of handlers executedを返します。私はそれがゼロになると思います。けれども、それはあなたがServerFramework::Initialize()を呼び出すあなたの限られたコードスニペットによって完全に明らかにされていませんasync_accept()

bool ServerFramework::Initialize() 
{ 
    StartAccept(); 
    mIOService.run(); 

    return true; 
} 

た後、それを呼び出してみてください。 short, self contained, correct exampleであなたの質問を編集することをお勧めします。少しでも手間をかけずにコンパイルすることができます。 main()のような定型文を追加することなく、現在のコードはコンパイルされません。

関連する問題