用于阻止连接的c ++ boost asio timeout

时间:2010-08-18 18:17:37

标签: c++ sockets boost boost-asio

我有一个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)为什么在解析无法访问的主机时我没有收到错误?

任何建议都会非常有用

2 个答案:

答案 0 :(得分:1)

超时是同步方法的错误位置,asio票证跟踪器中有一个冗长的discussion

  

我无法切换到异步模式   操作

根据超时要求,我发现这很不可能,发布其余代码并解释为什么不能使用异步操作。

答案 1 :(得分:-1)

当问到这个问题时,我猜ASIO没有任何关于如何完成所需OP的例子,即超时阻塞操作,例如阻塞套接字操作。现在有一些示例可以向您展示如何执行此操作。这个例子似乎很长,但那是因为它得到了很好的评论。它展示了如何在“一次性”模式中使用ioservice。

我认为这个例子是一个很好的解决方案。这里的其他解决方案打破了可移植性,并没有利用ioservice。如果可移植性不重要且ioservice似乎要花费很多--THEN--你不应该使用ASIO。无论如何,你都会创建一个ioservice(几乎所有的ASIO功能都依赖它,甚至同步套接字),所以,利用它。

ASIO example of timeout on blocking call

ASIO文档已经更新,因此请查看有关如何克服ASIO使用的“陷阱”的新示例。