Sté*_*ane 22 c++ sockets boost-asio
通过阅读其他Stack Overflow条目和boost::asio文档,我已经确认没有同步ASIO读/写调用也提供易于使用的超时作为调用的参数.
我正在使用带有超时的select(2)调用来转换旧式Linux套接字应用程序,我需要做大致相同的事情.
那么最好的方法是什么boost::asio?看一下asio文档,有很多令人困惑的例子,各种与定时器有关的东西,但我很困惑.
我很想看到一个简单易懂的例子:从套接字读取,但等待最多X秒,之后函数返回什么都没有,或者返回任何能够从套接字读取的内容在超时到期之前.
这已经在asio邮件列表中显示,还有一张请求该功能的票证.总而言之,如果您需要超时和可取消性,建议使用异步方法.
如果不能转换为异步方法,你可以尝试SO_RCVTIMEO和SO_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)等没有影响.
我使用了一些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)
我调试了它,似乎做了它应该做的事情.