【问题标题】:Boost Asio - Server doesn't receive messageBoost Asio - 服务器没有收到消息
【发布时间】:2012-03-10 08:51:42
【问题描述】:

我正在开发一款 3d(第一/第三人称)游戏,并且正在尝试使用 TCP 套接字使其成为多人游戏。我为此使用了 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;
}

服务器代码:

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));
}

【问题讨论】:

    标签: c++ sockets boost tcp boost-asio


    【解决方案1】:

    当您调用run() 时,您的io_service 似乎没有任何工作要做。

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

    它将返回number of handlers executed,我怀疑它为零。尝试在async_accept()之后调用它

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

    不过,您调用ServerFramework::Initialize() 的有限代码sn-ps 并不完全明显。我建议使用short, self contained, correct example 编辑您的问题,我们可以毫不费力地编译。如果没有额外的样板文件,您当前的代码将无法编译,例如 main()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      相关资源
      最近更新 更多