boost::asio::ip::tcp::resolver::iterator是什么?

15

我开始学习C++中的boost asio编程,查看示例时,我不理解boost::asio::ip::tcp::resolver::iterator是做什么的。

代码:

boost::asio::io_service io_service;

tcp::resolver resolver(io_service);
tcp::resolver::query query(argv[1]);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;

tcp::socket socket(io_service);
boost::system::error_code error = boost::asio::error::host_not_found;
while (error && endpoint_iterator != end)
{
  socket.close();
  socket.connect(*endpoint_iterator++, error);
}
请帮帮我,如果我的问题没有提供足够的信息,请原谅。

3
得爱boost.asio的命名空间。恶心 - Inverse
请注意:此查询仅用于服务。如果您正在寻找特定主机的服务,则需要向tcp :: resolver :: query ctor添加另一个参数。 - Donal Lafferty
1个回答

22

boost::asio::ip::tcp::resolver::iterator 迭代遍历您指定的主机的地址列表(主机可以有多个地址)。

就像 std::string::iterator 遍历字符串中的字符一样,boost::asio::ip::tcp::resolver::iterator 遍历其地址列表。

以下代码:

while (error && endpoint_iterator != end)
{
  socket.close();
  socket.connect(*endpoint_iterator++, error);
}

尝试与每个端点建立连接,直到成功或用尽所有端点(感谢Eugen Constantin Dinca的更正)。


2
实际上,while 会尝试连接每个端点,直到成功连接一个或者连接的端点用尽为止。因此,在循环结束时最多只会连接一个端点。 - Eugen Constantin Dinca
为什么要使用 *endpoint_iterator++ 而不是 endpoint_iterator++?为什么需要指针? - Hami
6
ip::tcp::resolver::iterator并不是指针,它看起来和行为类似于指针。后缀自增运算符(operator++(int))在间接引用运算符(operator*())获取底层的endpoint并返回给socket::connect()之后获得下一个迭代器。如果连接失败,将设置error并继续循环。这些概念与标准模板库中的迭代器相同。 - Sam Miller
为了澄清@SamMiller的评论,递增运算符在间接运算符之前被应用(由于运算符优先级规则),但由于“++”是后缀运算符,因此它将原始迭代器返回给间接运算符。 - pooya13
1
迭代器在最新版本的boost中已被弃用,有没有替代方法? - Srijan Chaudhary
1
@SrijanChaudhary 您可以使用以下函数auto const results = resolver.resolve(host, port); - Ernie Sanderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接