Использование таймаута Tcp в beast 1.70.0 - PullRequest
2 голосов
/ 16 апреля 2019

Я только что обновил библиотеку наддува с 1.68.0 до 1.70.0, чтобы получить операции тайм-аутов в (beast) ssl клиенте websocket async пример .

В приведенной выше ссылке вы увидите:

void
    on_resolve(
        beast::error_code ec,
        tcp::resolver::results_type results)
    {
        if(ec)
            return fail(ec, "resolve");

        // Set a timeout on the operation
        beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));

        // Make the connection on the IP address we get from a lookup
        beast::get_lowest_layer(ws_).async_connect(
            results,
            beast::bind_front_handler(
                &session::on_connect,
                shared_from_this()));
    }

Существует более одной функции, которая использует эту структуру для тайм-аутов. И для моего кода (в eclipse-cdt я вижу это так

Screenshot for this

Ошибка говорит (когда указатель мыши зависает на expires_after или async_connect ):

Метод 'expires_after' не может быть разрешен
OR
Метод async_connect не может быть разрешен

и когда указатель мыши наведен на «get_lowest_layer», появляется сообщение об ошибке

Неверные аргументы '
Кандидаты:
boost :: beast :: detail :: lower_layer_type_impl <# 0, bool74 0 значение 43 8 2 201 2 <br> повышение :: зверя :: подробнее :: has_next_layer_impl
boost :: beast :: detail :: has_next_layer_impl 1 # 0 0 71 4417 0 0> :: type & get_lowest_layer (# 0 &) «

Мне интересно, мне нужно связать какую-то библиотеку для этого. Я не могу понять, какой. Есть предложения?

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Это не имеет ничего общего с такими библиотеками.

  1. boost :: beast - это библиотека шаблонов, поэтому нет общих библиотек.

  2. Ваш редактор использует определения, а не ссылки, чтобы показать ошибки IDE.По сути, ваш редактор не смог найти заголовки, на которые вы указываете.

Если я должен догадаться, вы скомпилировали boost вручную, чтобы использовать boost :: beast, потому что он недоступен в большинствесовременные дистрибутивы Linux.Или вы, вероятно, не используете Linux.В этом примере есть некоторые включения, и ваша IDE не может их разрешить, потому что они не входят в ваши системные включения (/usr/include).Итак, он не знает, где искать.

Итак, в заключение, ваша система сборки неправильно связана с вашей IDE.

Чтобы решить эту проблему, попытайтесь понять, как ваша IDE устраняет отсутствующие заголовки.Добавьте к нему включаемый путь с заголовками повышения.

0 голосов
/ 19 апреля 2019

Я решил проблему в моем коде (с beast 1.70.0), установив время ожидания как

void
    on_resolve(
        beast::error_code ec,
        tcp::resolver::results_type results)
    {
        if(ec)
            return fail(ec, "resolve");

        // Set a timeout on the operation
        ws_.next_layer().expires_after(std::chrono::seconds(30));

        // Make the connection on the IP address we get from a lookup
         ws_.next_layer().async_connect(
            results,
            beast::bind_front_handler(
                &session::on_connect,
                shared_from_this()));
    }

Я также сделал некоторые изменения в моем коде (с beast 1.68.0) следующим образом

void Foo::closetimer_websocket(beast::error_code ec) {

    if (ec.message() == "Success") {
        ioc.stop();
    }
}

// closetimer_websocket is the member of class Foo. And FooObject is its instance
void session::SetAsyncOpTimeoutInSec(unsigned int time_inSeconds) {
    TcpTimer.expires_from_now((boost::posix_time::seconds(time_inSeconds)));
    TcpTimer.async_wait(bind(&Foo::closetimer_websocket, FooObject, placeholders::_1));
}

void session::on_resolve(beast::error_code ec,
        tcp::resolver::results_type results) {
     if(ec)
            return fail(ec, "resolve");

    //Set the timeout
    SetAsyncOpTimeoutInSec(5);

    // Make the connection on the IP address we get from a lookup
    net::async_connect(ws_.next_layer().next_layer(), results.begin(),
            results.end(),
            bind(&session::on_connect, shared_from_this(), placeholders::_1));
}

...