可能的重复:
如何在 boost asio 中设置阻塞套接字的超时?
我之前读过一些关于超时的条目,但我不明白。
我想要一个定义的连接超时。
连接代码如下所示:
try{
boost::asio::ip::tcp::resolver resolver(m_ioService);
boost::asio::ip::tcp::resolver::query query(link.get_host(), link.get_scheme());
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator end;
boost::system::error_code error = boost::asio::error::host_not_found;
while (error && endpoint_iterator != end)
{
m_socket.close();
m_socket.connect(*endpoint_iterator++, error);
}
}
我也想要一个读取超时。
I use boost::asio::read_until(m_socket, response, "\r\n");
用于读取标题。
是否可以设置简单的超时?
首先,我相信您应该始终使用异步方法,因为它们更好,并且您的设计只会从反应器模式方法中受益。
在糟糕的情况下,您很着急并且正在进行原型设计,同步方法可能会很有用。在这种情况下,我确实同意你的观点,如果没有任何超时支持,它们就无法在现实世界中使用。
我所做的很简单:
void HttpClientImpl::configureSocketTimeouts(boost::asio::ip::tcp::socket& socket)
{
#if defined OS_WINDOWS
int32_t timeout = 15000;
setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout));
#else
struct timeval tv;
tv.tv_sec = 15;
tv.tv_usec = 0;
setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
#endif
}
根据 OS_WINDOWS 宏,上面的代码既可以在 Windows 上运行,也可以在 Linux 和 MAC OS 上运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)