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

Sté*_*ane 22 c++ sockets boost-asio

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

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

那么最好的方法是什么boost::asio?看一下asio文档,有很多令人困惑的例子,各种与定时器有关的东西,但我很困惑.

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

Sam*_*ler 6

这已经在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)等没有影响.


Art*_*are 6

我使用了一些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;
};
Run Code Online (Sandbox Code Playgroud)

用法:

TimeoutAdjust adjust(5000);
sSocket.set_option(adjust);
Run Code Online (Sandbox Code Playgroud)

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

  • 我在这里读到的是“SO_SNDTIMEO”采用“timeval”,而不是“unsigned int”。http://linux.die.net/man/7/socket (2认同)
  • 使用上面的代码后我得到一个例外异常:set_option:无效的参数.如果你有一些参考代码,那么请分享相同的. (2认同)