tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address,port而已,通过tcp::resolver很容易实现设置和查询,它通过query把字符串格式的ip如192.168.0.200或主机名http://localhost,端口“8080”等转化成socket内部表示格式,这样我们应用的时候可以直接使用字符串的形式,而且不用再担心socket的字节顺序转化问题。示例如下:

[cpp] view plain copy  print?
  1. boost::asio::io_service io_service ;
  2. boost::asio::ip::tcp::resolver resolver(io_service);
  3. boost::asio::ip::tcp::resolver::query query("localhost", "9000");

还有要说明的是, boost::asio把通讯双方(server, client)都用endpoint的表示,所以endpoint中的address, port 分别封装了ip和端口。貌似resolver和endpoint不相干,于是乎出现tcp::resolver::iterator了,它是resolver的迭代器,其实就是endpoint的指针,那么就可以这样:

[cpp] view plain copy  print?
  1. boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
  2. boost::asio::ip::tcp::resolver::iterator end;
  3. boost::system::error_code error = boost::asio::error::host_not_found;
  4. boost::asio::ip::tcp::endpoint endpoint;
  5. while (error && endpoint_iterator != end)
  6. {
  7. endpoint = *endpoint_iterator ;
  8. socket.close();
  9. socket.connect(endpoint, error);
  10. endpoint_iterator++ ;
  11. }

得到endpoint后就好说啦,endpoint.address().to_string()就能够返回string格式的ip地址,endpoint.port()返回端口。

其实endpoint 完全可以自己构造,方法也是很简单的, tcp::endpoint(tcp::v4(), (unsigned short)9000) 这个是server端的用法,tcp::v4()直接返回自己的address,如果用于client那么需要设置server的ip ,实现如下:

[cpp] view plain copy  print?
  1. boost::system::error_code error = boost::asio::error::host_not_found;
  2. boost::asio::ip::address add;
  3. add.from_string("127.0.0.1");
  4. tcp::endpoint endpoint(add, short(9000));
  5. socket.connect(endpoint, error);

这样不使用resolver也是可以的。
还有更神奇的:

[cpp] view plain copy  print?
  1. boost::asio::io_service ioservice ;
  2. boost::asio::io_service my_io_service ;
  3. boost::asio::ip::tcp::resolver resolver(my_io_service);
  4. boost::asio::ip::tcp::resolver::query query("www.google.com", "http");
  5. boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
  6. boost::asio::ip::tcp::resolver::iterator end; // End marker.
  7. while (iter != end)
  8. {
  9. boost::asio::ip::tcp::endpoint endpoint = *iter++;
  10. std::cout << endpoint << std::endl;
  11. }

这样有发现一个新的用途,通过resolver迭代可以得到多个节点endpoint,比如google 就有好几个ip。
上面这个例子的运行结果:

[cpp] view plain copy  print?
  1. 74.125.128.106:80
  2. 74.125.128.147:80
  3. 74.125.128.99:80
  4. 74.125.128.103:80
  5. 74.125.128.104:80
  6. 74.125.128.105:80

【Boost】boost库asio详解5——resolver与endpoint使用说明相关推荐

  1. 【Boost】boost库asio详解7——boost::asio::buffer用法

    1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 [cpp] view plain copy  print? ...

  2. 【Boost】boost库asio详解8——TCP的简单例子1

    摘于boost官网的几个例子, 做了点小修改, 笔记之. 同步客户端 [cpp] view plain copy  print? void test_asio_synclient() { typede ...

  3. 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题

    io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. [cpp] view plaincopy print? void tes ...

  4. 【Boost】boost库asio详解9——UDP的简单例子1

    服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...

  5. 【Boost】boost库asio详解9——TCP的简单例子2

    客户端: // Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream> #inclu ...

  6. 【Boost】boost库asio详解6——boost::asio::error的用法浅析

    1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy  print? boost::system::error_code error 我们用这 ...

  7. 【Boost】boost库asio详解4——deadline_timer使用说明

    deadline_timer和socket一样,都用io_service作为构造函数的参数.也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联.这同样意味着在析构 io_s ...

  8. 【Boost】boost库asio详解3——io_service作为work pool

    无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE. 使用io_service作为处理工作的work pool,可 ...

  9. 【Boost】boost库asio详解2——strand与io_service区别

    [cpp] view plain copy  print? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. ...

最新文章

  1. Iframe 高度自适应
  2. 皮一皮:落伍了落伍了
  3. [置顶]WebService学习总结(4)——第三方webService服务调用
  4. ADOQuery的LockType
  5. redis安装及用Redis Desktop Manager连接Redis
  6. 在 WSL2.0 的 Ubuntu 18 里使用 Docker
  7. linux 测试程序性能,推荐一款Linux系统的性能测试软件
  8. php中in array循环,在php中in_array的使用方法
  9. ‘packaging‘ with value ‘jar‘ is invalid. Aggregator projects require ‘pom‘ as packaging.
  10. 【Spring】Spring boot 如何进行私有方法测试
  11. JDK1.8下载与安装及环境变量配置
  12. 解析身份证号码(附加Java代码)
  13. IP (网络之间互连的协议)
  14. 系列篇|单目结构光三维成像系统的标定方法
  15. codeforces 607B Zuma 区间dp
  16. 小布什逗留香港6小时 赴知名裁缝店做18套西装——中新网
  17. github项目创建
  18. 拼多多商品详情采集上传京东店铺(拼多多商品详情接口,京东商品详情接口,整店宝贝采集接口,一键采集宝贝详情接口,无货源商品详情采集接口)代码对接教程
  19. TS 中 any 和 unknown 的区别
  20. 使用nodejs、express以及MySQL制作一个简单类淘宝的登录注册页面

热门文章

  1. 配置Swagger2
  2. ThreadLocal的重要方法介绍
  3. 依赖注入_set方法注入_构造器注入
  4. if语句和缩进部分是一个完整的代码块
  5. 通过Zuul上传文件,禁用Zuul的Filters
  6. 单例设计模式-反射攻击解决方案及原理分析
  7. Java并发包--阻塞队列(BlockingQueue)
  8. 【报错笔记】pom.xml第一行报错,显示红色叉号
  9. java B2B2C Springcloud电子商城系统-Spring Cloud常见问题与总结(四)
  10. 六种排序算法的JavaScript实现以及总结