c++ - 用时间检查数据?

标签 c++ tcp boost-asio

有没有办法在 asio 中检查特定时间的数据?

我有一个带有方法的 asio 套接字的客户端

bool ASIOClient::hasData()
{
    return m_socket->available();
}

我想在这里有某种延迟,这样它最多可以检查 1 秒的数据并更早地返回。此外,由于显而易见的原因,我不想对它进行投票,因为它可能需要一秒钟。我使用它的原因是,我确实向客户端发送数据并等待响应。如果他在一定时间内没有回应,我会关闭 socket 。这就是提到 hasData 的原因。

我知道使用 select 和 fd_set 是可行的。


asio 客户端是在服务器套接字类的 Accept 方法中创建的,稍后用于处理请求并将数据发送回连接到这里的人。

int ASIOServer::accept(const bool& blocking)
{
    auto l_sock = std::make_shared<asio::ip::tcp::socket>(m_io_service);
    m_acceptor.accept(*l_sock);
    auto l_client = std::make_shared<ASIOClient>(l_sock);
    return 0;
}

最佳答案

您只需要尝试阅读

通常的方法是为所有可能需要“很长时间”(甚至无限长)的异步操作定义截止日期。

这在异步执行中很自然:

只需添加一个截止时间计时器:

 boost::asio::deadline_timer tim(svc);
 tim.expires_from_now(boost::posix_time::seconds(2));
 tim.async_wait([](error_code ec) {
      if (!ec) // timer was not canceled, so it expired
      {
           socket_.cancel(); // cancel pending async operation
      }
 });

如果你想将它用于同步调用,你可以明智地使用 poll() 而不是 run()。看到这个答案:boost::asio + std::future - Access violation after closing socket它实现了一个辅助程序 await_operation,它同步但超时地运行单个操作。

关于c++ - 用时间检查数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33844441/

相关文章:

c++ - 为什么这个合并排序函数返回带零的链表(C++)?

c++ - 服务器和客户端之间如何异步通信

C++ Boost.ASIO async_read_until 慢

c++ - 如何在 C++ 中使用 GMock 模拟方法(非虚拟)以返回特定值?

c++ - 从 winsock 开始无法获得第一位编译

C++多菱形继承和纯虚函数

linux - 使用netfilter_queue将数据包复制到用户层可以,修改数据包并注入(inject)内核失败

performance - 当我的 Erlang TCP 代理收到许多并发请求时,为什么性能会下降那么多?

c++ - 谷歌 Protocol Buffer - 位错误的概率以及减少错误的方法

c++ - boost::asio io_service::run_one 导致段错误