Как создать простое серверное / клиентское приложение, используя boost.asio? - PullRequest
2 голосов
/ 03 мая 2010

Я просматривал примеры boost.asio и мне интересно, почему нет примера простого примера сервер / клиент, который печатает строку на сервере и затем возвращает ответ клиенту.
Я пытался изменить эхо-сервер, но я не могу понять, что я вообще делаю.
Может кто-нибудь найти мне шаблон клиента и шаблон сервера?
Я хотел бы в конечном итоге создать приложение сервер / клиент, которое получает двоичные данные и просто возвращает клиенту подтверждение получения данных.
РЕДАКТИРОВАТЬ:

void handle_read(const boost::system::error_code& error,
    size_t bytes_transferred) // from the server
{
    if (!error)
    {
        boost::asio::async_write(socket_,
            boost::asio::buffer("ACK", bytes_transferred),
            boost::bind(&session::handle_write, this,
            boost::asio::placeholders::error));
    }
    else
    {
        delete this;
    }
}

Это возвращает клиенту только «A».
Также в data_ я получаю много странных символов после самого ответа.
Это мои проблемы.
РЕДАКТИРОВАТЬ 2:
Итак, главная проблема с клиентом.

size_t reply_length = boost::asio::read(s,
        boost::asio::buffer(reply, request_length));

Поскольку это эхо-сервер, «ACK» будет появляться только тогда, когда длина запроса превышает 3 символа.
Как мне это преодолеть?
Я попытался изменить request_length на 4, но это только заставляет клиента ждать и ничего не делать.

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

В конце концов я обнаружил, что проблема заключается в следующем фрагменте кода на сервере:

void handle_read(const boost::system::error_code& error,
size_t bytes_transferred) // from the server
{
    if (!error)
    {
        boost::asio::async_write(socket_,
            boost::asio::buffer("ACK", 4), // replaced bytes_transferred with the length of my message 
            boost::bind(&session::handle_write, this,
            boost::asio::placeholders::error));
    }
    else
    {
        delete this;
    }
}

А в клиенте:

size_t reply_length = boost::asio::read(s,
            boost::asio::buffer(reply, 4)); // replaced request_length with the length of the custom message.
1 голос
/ 04 мая 2010

Клиент / сервер echo - простой пример. С какими областями у вас возникают проблемы? Клиент должен быть довольно простым, поскольку он использует API блокировки. Сервер немного сложнее, поскольку он использует асинхронные API с обратными вызовами. Когда вы сводите его к основным понятиям (сеанс, сервер, io_service), это довольно легко понять.

...