【问题标题】:Defining a timeout on boost async_receive_from在 boost async_receive_from 上定义超时
【发布时间】:2017-12-13 09:32:53
【问题描述】:

我有一个 boost socket,我在上面定义了一个异步接收:

void recv() {
  boost_socket->async_receive_from(
    boost::asio::buffer(buffer, MTU),
    endpoint,
    [this](boost::system::error_code ec, std::size_t bytes) {
      // Treatment...
      if (event) {
        Component::recv(handler);
      }
    }
  });
}

但是如果没有事件到达这个套接字(套接字上没有数据包),我会被困在 lambda 方法中......

有没有办法在这个 recv 上定义超时?

【问题讨论】:

  • 选择一个问题。 “定义提升 async_receive_from 的超时时间”?或者“有没有办法在这个recv 上定义超时?”。这些是完全不相关的不同问题

标签: c++ sockets boost boost-asio


【解决方案1】:

有没有办法在这个 recv 上定义超时?

如果对Component::recv 的调用本身就是asio 操作,您可以定义一个截止时间计时器,在超时时取消读取操作。您可以在Boost documentation (example/cpp03/timeouts/blocking_tcp_client.cpp) 中找到示例。

否则,你可以使用 std::future:

using namespace std::chrono_literals;
auto fut = std::async(std::launch::async, &Component::recv, handler);
if(fut.wait_for(500ms) == std::future_status::timeout) {
   // timed out
}

【讨论】:

  • 这不是一个asio操作:(我应该用asio封装它吗?
  • @klaus 你可以改用std::future
  • 假设 Component::recv 是线程安全的。请注意,丢弃未来不会“取消”recv 操作。
  • 谢谢。这是 c++ 14 所必需的,不是吗?如果我使用的是 c++ 11,还有别的吗?
  • @klaus 语法为auto fut = std::async(std::launch::async, &YourClass::f, B, arg);
猜你喜欢
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多