我有一个C ++ boost客户端执行阻塞连接,并在收到响应后处理该消息。我面临一个奇怪的问题。
tcp::resolver::query query(tcp::v6(), this->host, port,tcp::resolver::query::v4_mapped);
iterator = resolver.resolve(query);
socket = new tcp::socket(io_service);
socket->connect(*iterator);
我尝试连接到ping6无法访问的计算机(但启用了IPV6)。尽管如此,我在尝试解决第2行中的查询时没有收到任何错误。因此,在发出错误之前尝试连接需要花费太多时间。我的问题: -
1)是否可以在asio的阻塞连接上超时?我无法切换到异步操作模式。
2)为什么在解析无法访问的主机时我没有收到错误?
任何建议都会非常有用
答案 0 :(得分:1)
答案 1 :(得分:-1)
当问到这个问题时,我猜ASIO没有任何关于如何完成所需OP的例子,即超时阻塞操作,例如阻塞套接字操作。现在有一些示例可以向您展示如何执行此操作。这个例子似乎很长,但那是因为它得到了很好的评论。它展示了如何在“一次性”模式中使用ioservice。
我认为这个例子是一个很好的解决方案。这里的其他解决方案打破了可移植性,并没有利用ioservice。如果可移植性不重要且ioservice似乎要花费很多--THEN--你不应该使用ASIO。无论如何,你都会创建一个ioservice(几乎所有的ASIO功能都依赖它,甚至同步套接字),所以,利用它。
ASIO example of timeout on blocking call
ASIO文档已经更新,因此请查看有关如何克服ASIO使用的“陷阱”的新示例。