当前位置: 首页 > 知识库问答 >
问题:

ASIO::读取时超时

谢财
2023-03-14

我需要知道如何读取(同步或异步不重要)与超时。我想检查一个设备是否与串行端口连接。

为此,我使用asio::write,然后等待设备的响应。

如果连接了设备asio::read(serial,Boost::asio::buffer(&r,1))工作正常,但如果没有设备,程序就会停止,这就是我需要超时的原因

共有1个答案

庾勇军
2023-03-14

Igor R发布的代码没有为我编译。这里是我对他的代码的改进版本,它工作得很完美。它使用lambdas来摆脱set_result帮助器函数。

template <typename SyncReadStream, typename MutableBufferSequence>
void readWithTimeout(SyncReadStream& s, const MutableBufferSequence& buffers, const boost::asio::deadline_timer::duration_type& expiry_time)
{
    boost::optional<boost::system::error_code> timer_result;
    boost::asio::deadline_timer timer(s.get_io_service());
    timer.expires_from_now(expiry_time);
    timer.async_wait([&timer_result] (const boost::system::error_code& error) { timer_result.reset(error); });

    boost::optional<boost::system::error_code> read_result;
    boost::asio::async_read(s, buffers, [&read_result] (const boost::system::error_code& error, size_t) { read_result.reset(error); });

    s.get_io_service().reset();
    while (s.get_io_service().run_one())
    { 
        if (read_result)
            timer.cancel();
        else if (timer_result)
            s.cancel();
    }

    if (*read_result)
        throw boost::system::system_error(*read_result);
}
 类似资料:
  • 问题内容: 这是一个基于客户端/服务器的简单ping / pong程序。不幸的是,IT无法正常工作并显示以下错误消息: 它停止在CLIENT TASK 30行,实际上,客户端不读取服务器已发送的内容。这里的代码: 服务器 服务器任务 客户 客户任务 问题答案: 问题出在循环内部的使用与从连接另一端处理套接字的方式之间的交互。 仅当从其读取的流结束时才返回-1,这在本质上将意味着套接字已关闭。在关闭

  • 问题内容: 我有一个RESTful服务器,该服务器从客户端接收http POST输入以投票表决服务器上的歌曲。我已经使用Apache HTTPClient作为客户端。 当我连续点击投票按钮时,经过几次投票(例如7-8),我得到了例外。当我搜索原因时,我发现这是因为客户端在超时期间没有得到服务器响应。但是问题是,当我使用其他应用程序(例如Chrome REST Console或JMeter)时,可以

  • 我正在尝试使用Spring Data Redis绝地组合连接到AWS ElastiCache Redis。[Redis Cluster enabled,因此它有Cluster Config endpoint,有3个碎片-每个碎片有1个主节点和2个副本节点] 读取超时错误。 AWS Redis服务器版本:5.0.3/群集模式:已启用/SSL:已启用/Auth:已启用(通过密码) 库——Spring数

  • 我有一个API返回一个json,它是GET方法类型的。因为它是GET,所以当我在浏览器中打开URL时,它可以正常工作并呈现json,但是,当使用RestTemplate检索json时,它失败了。 能否请您提供一种阅读以下API的方法。 API URL:https://www.nseindia.com/API/option-chain-indexs?symbol=nifty Spring BootR

  • 我最近用java1将我的项目从jboss4迁移到了wildfly 8.2。8.我有一个使用SAAJ的webservice调用,它在命令行中运行良好。但当它从wildfly8内部运行时。2.60秒后超时。我在jboss论坛上读到,读取请求的默认超时时间为60秒。所以我在单机版中更改了配置。xml到 但60秒后仍会超时,并出现以下错误。 我在这里读到,我可以设置超时,但我不必这样做,因为程序运行正常,

  • 这是来自.properties得my DB配置: 这是config.xml: 实际上,我可以很容易地访问我们的本地web应用程序,并且可以在日志中看到到DB的连接跟踪,但对于批处理来说,情况并非如此。 在我有了这个之后: 有人帮忙吗?