C++ 检查是否有定时数据?

C++ 检查是否有定时数据?,c++,tcp,boost-asio,C++,Tcp,Boost Asio,有没有办法在asio中检查特定时间的数据 我有一个带有asio套接字的客户端,它有一个方法 bool ASIOClient::hasData() { return m_socket->available(); } 我想在这里有一些延迟,这样它可以检查最多1秒的数据,并返回更多。此外,我不想对它进行民意调查,因为很明显,这需要一秒钟的时间。我使用它的原因是,我确实向客户端发送数据并等待响应。如果他在某个时间内没有反应,我就关上插座。这就是hasData的作用 我知道,通过选择和fd

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

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

bool ASIOClient::hasData()
{
    return m_socket->available();
}
我想在这里有一些延迟,这样它可以检查最多1秒的数据,并返回更多。此外,我不想对它进行民意调查,因为很明显,这需要一秒钟的时间。我使用它的原因是,我确实向客户端发送数据并等待响应。如果他在某个时间内没有反应,我就关上插座。这就是hasData的作用

我知道,通过选择和fd_集合,这是可能的


asio客户机是在ServerSocket类的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;
}
int-ASIOServer::accept(常量布尔和阻塞)
{
自动l_sock=std::使_共享(m_io_服务);
m_acceptor.accept(*l_sock);
自动l_客户端=std::使_共享(l_sock);
返回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()
。请参阅此答案:它实现了一个helper
wait_操作
,该操作在超时的情况下同步运行单个操作。

感谢您的回答。我认为它的cald ASIOClient有点误导。这里它是一个服务器的Clienthandle,所以基本上写和读的包装器没有自己的服务。我的坏消息是,我错过了我没有使用boost,我使用ASIO作为独立的,所以如果我认为正确的话,没有截止时间计时器。应该有一个截止时间计时器。也许你也有一个
高分辨率计时器
你可以使用(它使用c++11
std::chrono::高分辨率时钟
)@BennX我不知道“ASIOClient”和“Clienthandle”来自哪里。Asio套接字在没有服务引用的情况下无法构造。如果您有时间,让我们继续这里的操作:首选
选择
@basilestrynkevitch我正在为Windows开发。但我知道我可以选择超时(或在这里轮询)。但我如何在Asio插座上实现这一点?它有任何simelar功能吗?它是特定于操作系统的。我对Windows一无所知。问另一个问题(并用Windows标记)