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

时间:2010-12-29 10:07:44

标签: c++ sockets boost-asio

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

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

那么在boost::asio中执行此操作的最佳方式是什么?看一下asio文档,有很多令人困惑的例子可以和定时器做各种事情,但我很困惑。

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

2 个答案:

答案 0 :(得分:6)

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


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

  

SO_RCVTIMEO和SO_SNDTIMEO                 指定接收或发送超时,直到报告为止   错误。参数是一个结构   timeval中。如果是输入或输出   这段时间的功能块   时间和数据已发送                 或收到,该函数的返回值将是   转移的数据量;如果不   数据已经转移和   已经达到超时,然后是-1   返回errno设置为                 EAGAIN或EWOULDBLOCK就像指定了套接字一样   是非阻塞的。如果超时是   设置为零(默认值)然后设置为   操作永远不会超时。   超时只有效果                 对于执行套接字I / O的系统调用(例如,read(2),   recvmsg(2),send(2),sendmsg(2));   超时对select(2)没有影响,   poll(2),epoll_wait(2)等。

答案 1 :(得分:6)

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

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);

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