提升asio超时[重复]
Posted
技术标签:
【中文标题】提升asio超时[重复]【英文标题】:boost asio timeout [duplicate] 【发布时间】:2011-08-27 19:33:09 【问题描述】:可能重复:How to set a timeout on blocking sockets in 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);
我也想要读取超时。
我使用boost::asio::read_until(m_socket, response, "\r\n");
读取标题。
是否可以设置 SIMPLE 超时?
【问题讨论】:
阅读how to set a timeout on blocking socket看来没有捷径可走。 【参考方案1】:首先,我认为您应该始终使用异步方法,因为它们更好,并且您的设计只会从反应器模式方法中受益。 在您赶时间并且正在制作原型的糟糕情况下,同步方法可能很有用。在这种情况下,我同意你的观点,如果没有任何超时支持,它们就不能在现实世界中使用。
我做的很简单:
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 上都可以工作。
【讨论】:
我是否必须包含一些库才能完成这项工作? 给出错误:'HttpClientImpl' 尚未声明 你能帮我找出为什么你的答案does not work为我吗? 设置套接字选项可能不会对 Asio 操作产生预期的影响。详情请见here。 真的有人用上面的代码用 Linux 实现了超时吗?使用 Windows 时一切正常。但是,当我使用 Ubuntu 编译和运行它时,两个setsockop
调用都不会返回错误代码,但读取调用仍然阻塞?【参考方案2】:
使用 boost::asio 和 read_until 等同步调用不允许轻松设置超时。
我建议改用异步调用(如 async_read),并将其与截止日期计时器相结合以实现此目标。
【讨论】:
+1 推荐异步调用。 异步 asio 祝你好运。我在使用它们时遇到了神秘的崩溃,虽然不经常,但足以怀疑应用程序的稳定性。当我切换到每个使用同步 asio 的多个线程时,它们都消失了。 很抱歉您在使用 boost::asio 时遇到了问题。虽然这绝对是一个学习曲线,并且有很多事情必须“恰到好处”地完成,但我发现对于在繁重网络负载下的应用程序的跨平台开发(以至于像 select() 这样的同步调用, 造成了严重的瓶颈),boost::asio 的表现非常好,并带来了明确的好处。 @wally 异步编程很难正确,没有人会否认这一点。应用程序流控制的反转有时特别令人困惑。 @Chad 遗憾的是,当我使用不依赖于Boost
的独立 asio
时,deadline_timer
不可用。关于如何使用独立的asio
实现这一目标的任何想法?以上是关于提升asio超时[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用许多 boost::asio::deadline_timer [重复]