通过阅读其他Stack Overflow条目和boost::asio
文档,我已经确认没有同步ASIO读/写调用也提供了一个易于使用的超时作为调用的参数。 / p>
我正在使用带有超时的select(2)调用转换旧式Linux套接字应用程序,我需要做大致相同的事情。
那么在boost::asio
中执行此操作的最佳方式是什么?看一下asio文档,有很多令人困惑的例子可以和定时器做各种事情,但我很困惑。
我很想看到一个简单易懂的例子:从套接字读取,但等待最多X秒,之后函数返回什么都没有,或返回任何它是什么能够在超时到期之前从套接字读取。
答案 0 :(得分:6)
这已在asio邮件列表中显示,还有ticket请求该功能。总而言之,如果您需要超时和可取消性,建议使用异步方法。
如果无法转换为异步方法,可以尝试使用SO_RCVTIMEO
和SO_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);
我调试了它,它似乎做了它应该做的事。