提升 ASIO 超时
boost asio timeout
可能的重复项:
如何在升压 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, "rn");
来读取标题。
是否可以将 SIMPLE 设置为超时?
我认为您应该始终使用异步方法,因为它们更好,并且您的设计只会从反应堆模式方法中受益。如果您赶时间并且正在制作原型,则同步方法可能很有用。在这种情况下,我同意你的观点,即没有任何超时支持,它们不能在现实世界中使用。
我所做的非常简单:
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上都有效。
使用 boost::asio 和像 read_until 这样的同步调用不允许轻松设置超时。
我建议转向异步调用(如async_read),并将其与deadline_timer相结合以实现此目标。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- C++减少modbus_connect超时
- 缓慢提升ASIO
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- 将超时到udp call recere_从ASIO中应用
- 如何通过超时检查Boost ASIO套接字中的数据
- 设置流的 ASIO 超时
- BOOST ASIO :: DENALLINE_TIMER在超时之前重置
- 如何使用boost::asio::read_some实现超时
- boost::asio中异步操作超时的通用方法
- 使用boost::asio::async_read实现超时,而不调用io_service上的run
- 带线程超时的Boost ASIO线程池
- Boost ASIO套接字读取N字节不多不少,等待它们到来或超时异常
- Boost.Asio:异步操作超时
- 提升 ASIO 超时
- Boost asio异步http客户端超时