【问题标题】:What does boost::asio::ip::tcp::resolver::iterator do?boost::asio::ip::tcp::resolver::iterator 是做什么的?
【发布时间】:2011-02-24 20:42:27
【问题描述】:

我从 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);
}

如果我的问题没有提供足够的信息,请帮助我并原谅我。

【问题讨论】:

  • 一定会喜欢 boost.asio 命名空间。 酒吧
  • 仅供参考:查询仅针对服务。如果您正在寻找特定主机 fpr 服务,则需要向 tcp::resolver::query ctor 添加另一个参数。

标签: c++ boost boost-asio


【解决方案1】:

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 的更正)。

【讨论】:

  • 实际上while 尝试连接到每个端点,直到它成功或用完端点。因此,在循环结束时最多将连接 1 个端点。
  • 为什么使用*endpoint_iterator++ 而不是endpoint_iterator++?为什么需要指针?
  • @Hami ip::tcp::resolver::iterator 不是指针,它只是看起来和行为就像一个指针。后缀增量运算符 (operator++(int)) 获取下一个迭代器之后 间接运算符 (operator*()) 获取底层 endpoint 并将其返回给 socket::connect()。如果连接失败,则设置error 并继续循环。这些与标准模板库中的迭代器使用的概念相同。
  • 迭代器在最新版本的 boost 中已被弃用,是否有替代方案?
  • @SrijanChaudhary 你可以使用下面的functionauto const results = resolver.resolve(host, port);
猜你喜欢
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多