2012-02-19 83 views
3

我正在開發一個3D(第一/第三人稱)遊戲,我試圖讓它使用TCP套接字進行多人遊戲。我爲此使用了boost asio庫,並且我略微超出了我的想象。我在boost asio文檔頁面上玩過一些教程和示例,他們編譯/運行/工作得很好,對於一切如何工作我都有點困惑。Boost 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()做。它會返回number of handlers executed,我懷疑它是零。嘗試後async_accept()

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

    return true; 
} 

雖然調用它,它是不是在那裏你調用ServerFramework::Initialize()您有限的代碼段完全明顯。我建議編輯你的問題,用我們可以毫不費力地編譯的short, self contained, correct example。如果沒有附加的樣板文件,您的當前代碼將無法編譯,如main()