繁体   English   中英

C ++ Boost ASIO:如何读取/写入超时?

[英]C++ Boost ASIO: how to read/write with a timeout?

通过阅读其他Stack Overflow条目和boost::asio文档,我已经确认没有同步ASIO读/写调用也提供了一个易于使用的超时作为调用的参数。

我正在使用带有超时的select(2)调用来转换旧式Linux套接字应用程序,我需要做大致相同的事情。

那么在boost::asio执行此操作的最佳方法是什么? 看一下asio文档,有很多令人困惑的例子,各种与定时器有关的东西,但我很困惑。

我很想看到一个简单易懂的例子: 从套接字读取,但等待最多X秒,之后函数返回什么都没有,或者返回它能够从套接字中读取的内容在超时到期之前。

我使用了一些asio文档来产生这个:

class TimeoutAdjust
{
public:
  TimeoutAdjust(unsigned int dwTimeout) : m_dwTimeout(dwTimeout) {};

  template<class Protocol>
  int level(const Protocol& p) const {return SOL_SOCKET;}

  template<class Protocol>
  int name(const Protocol& p) const {return SO_SNDTIMEO;}

  template<class Protocol>
  const void* data(const Protocol& p) const {return &m_dwTimeout;}

  template<class Protocol>
  size_t size(const Protocol& p) const {return sizeof(m_dwTimeout);}
private:
  unsigned int m_dwTimeout;
};

用法:

TimeoutAdjust adjust(5000);
sSocket.set_option(adjust);

我调试了它,似乎做了它应该做的事情。

这已经在asio邮件列表中显示,还有一张请求该功能的票证 总而言之,如果您需要超时和可取消性,建议使用异步方法。


如果无法转换为异步方法,则可以尝试使用SO_RCVTIMEOSO_SNDTIMEO套接字选项。 可以使用setsockopt设置它们,可以使用boost :: asio :: ip :: tcp :: socket :: native方法获取描述符。 man 7 socket手册页说

SO_RCVTIMEO和SO_SNDTIMEO指定接收或发送超时,直到报告错误。 参数是struct timeval。 如果输入或输出功能在这段时间内阻塞,并且数据已被发送或接收,则该功能的返回值将是传输的数据量; 如果没有传输数据并且已达到超时,则返回-1,并将errno设置为EAGAIN或EWOULDBLOCK,就好像套接字被指定为非阻塞一样。 如果超时设置为零(默认值),则操作永远不会超时。 超时仅对执行套接字I / O的系统调用有效(例如,read(2),recvmsg(2),send(2),sendmsg(2)); 超时对select(2),poll(2),epoll_wait(2)等没有影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM