2012-02-19 71 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()