在 beast 1.70.0 中使用 Tcp 超时

Using Tcp timeout in beast 1.70.0

我刚刚将 boost 库从 1.68.0 更新到 1.70.0 以获得 (beast) websocket ssl client async example 中的超时操作。

在上面link你会看到:

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 中,我是这样看的

错误说(当鼠标指针悬停在 expires_afterasync_connect 上时):

Method 'expires_after' could not be resolved
OR
Method 'async_connect' could not be resolved

当鼠标指针移到 "get_lowest_layer" 上时,错误提示

Invalid arguments '
Candidates are:
boost::beast::detail::lowest_layer_type_impl<#0,bool74 0 value 43 8 2 201 2
boost::beast::detail::has_next_layer_impl
boost::beast::detail::has_next_layer_impl 1 #0 0 71 4417 0 0>::type & get_lowest_layer(#0 &) '

我想知道为此我需要 link 一些库。我不知道是哪一个。 有什么建议吗?

这与so库无关。

  1. boost::beast是模板库,所以没有共享库。

  2. 您的编辑器使用定义而不是链接来显示此 IDE 错误。基本上你的编辑器找不到你指向的headers。

如果我不得不猜测,您已经手动编译了 boost 以使用 boost::beast,因为它在大多数现代 Linux 发行版中不可用。或者您可能没有使用 Linux。该示例有一些包含,而您的 IDE 无法解析它们,因为它们不在您的系统包含 (/usr/include) 中。所以,它不知道去哪里找。

因此,总而言之,您的构建系统没有与您的 IDE 正确耦合。

要解决此问题,请尝试了解您的 IDE 如何解决丢失的 headers。添加具有提升 headers 的包含路径。

我已经通过将超时设置为

解决了我的代码中的问题(使用 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));
}