Boost Asio - сервер не получает сообщение - PullRequest
3 голосов
/ 20 февраля 2012

Я разрабатываю 3d-игру (от первого / третьего лица) и пытаюсь сделать ее многопользовательской, используя TCP-сокеты.Я использую для этого библиотеку boost asio, и я немного над головой.Я немного поиграл с учебными пособиями и примерами на странице Boost Asio Doc, и они отлично скомпилированы / работают / работают, я просто немного запутался, как все работает.

Прямо сейчасЯ просто пытаюсь заставить сервер принимать сообщения от клиента и распечатывать сообщение после его получения.Когда я выполняю код ниже (он компилируется / ссылки / работает нормально), ничего не происходит.В частности, клиент, кажется, успешно отправил сообщение, а сервер, кажется, никогда не получает сообщение.

Код клиента:

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

1 Ответ

4 голосов
/ 20 февраля 2012

Не похоже, что у вашего io_service есть какая-то работа, когда вы вызываете run().

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

    return true;
}

вернет количество обработчиков, выполненных , я подозреваю, что это ноль. Попробуйте вызвать его после async_accept()

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

    return true;
}

Хотя это не совсем очевидно из-за ваших ограниченных фрагментов кода, где вы вызываете ServerFramework::Initialize(). Я предлагаю отредактировать ваш вопрос на коротком, самодостаточном, правильном примере , который мы можем собрать без особых усилий. Ваш текущий код не будет компилироваться без дополнительных шаблонов, например main().

...