有没有办法在 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/