【Boost】boost库asio详解5——resolver与endpoint使用说明
tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address,port而已,通过tcp::resolver很容易实现设置和查询,它通过query把字符串格式的ip如192.168.0.200或主机名http://localhost,端口“8080”等转化成socket内部表示格式,这样我们应用的时候可以直接使用字符串的形式,而且不用再担心socket的字节顺序转化问题。示例如下:
- boost::asio::io_service io_service ;
- boost::asio::ip::tcp::resolver resolver(io_service);
- 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的指针,那么就可以这样:
- boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
- boost::asio::ip::tcp::resolver::iterator end;
- boost::system::error_code error = boost::asio::error::host_not_found;
- boost::asio::ip::tcp::endpoint endpoint;
- while (error && endpoint_iterator != end)
- {
- endpoint = *endpoint_iterator ;
- socket.close();
- socket.connect(endpoint, error);
- endpoint_iterator++ ;
- }
得到endpoint后就好说啦,endpoint.address().to_string()就能够返回string格式的ip地址,endpoint.port()返回端口。
其实endpoint 完全可以自己构造,方法也是很简单的, tcp::endpoint(tcp::v4(), (unsigned short)9000) 这个是server端的用法,tcp::v4()直接返回自己的address,如果用于client那么需要设置server的ip ,实现如下:
- boost::system::error_code error = boost::asio::error::host_not_found;
- boost::asio::ip::address add;
- add.from_string("127.0.0.1");
- tcp::endpoint endpoint(add, short(9000));
- socket.connect(endpoint, error);
这样不使用resolver也是可以的。
还有更神奇的:
- boost::asio::io_service ioservice ;
- boost::asio::io_service my_io_service ;
- boost::asio::ip::tcp::resolver resolver(my_io_service);
- boost::asio::ip::tcp::resolver::query query("www.google.com", "http");
- boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
- boost::asio::ip::tcp::resolver::iterator end; // End marker.
- while (iter != end)
- {
- boost::asio::ip::tcp::endpoint endpoint = *iter++;
- std::cout << endpoint << std::endl;
- }
这样有发现一个新的用途,通过resolver迭代可以得到多个节点endpoint,比如google 就有好几个ip。
上面这个例子的运行结果:
- 74.125.128.106:80
- 74.125.128.147:80
- 74.125.128.99:80
- 74.125.128.103:80
- 74.125.128.104:80
- 74.125.128.105:80
【Boost】boost库asio详解5——resolver与endpoint使用说明相关推荐
- 【Boost】boost库asio详解7——boost::asio::buffer用法
1. asio::buffer常用的构造方法 asio::buffer有多种的构造方法,而且buffer大小是自动管理的 1.1 字符数组 [cpp] view plain copy print? ...
- 【Boost】boost库asio详解8——TCP的简单例子1
摘于boost官网的几个例子, 做了点小修改, 笔记之. 同步客户端 [cpp] view plain copy print? void test_asio_synclient() { typede ...
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁. [cpp] view plaincopy print? void tes ...
- 【Boost】boost库asio详解9——UDP的简单例子1
服务器: #include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #includ ...
- 【Boost】boost库asio详解9——TCP的简单例子2
客户端: // Client.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostream> #inclu ...
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
1. 概述 一般而言我们创建用于接收error的类型大多声明如下: [cpp] view plain copy print? boost::system::error_code error 我们用这 ...
- 【Boost】boost库asio详解4——deadline_timer使用说明
deadline_timer和socket一样,都用io_service作为构造函数的参数.也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联.这同样意味着在析构 io_s ...
- 【Boost】boost库asio详解3——io_service作为work pool
无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE. 使用io_service作为处理工作的work pool,可 ...
- 【Boost】boost库asio详解2——strand与io_service区别
[cpp] view plain copy print? namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. ...
最新文章
- Iframe 高度自适应
- 皮一皮:落伍了落伍了
- [置顶]WebService学习总结(4)——第三方webService服务调用
- ADOQuery的LockType
- redis安装及用Redis Desktop Manager连接Redis
- 在 WSL2.0 的 Ubuntu 18 里使用 Docker
- linux 测试程序性能,推荐一款Linux系统的性能测试软件
- php中in array循环,在php中in_array的使用方法
- ‘packaging‘ with value ‘jar‘ is invalid. Aggregator projects require ‘pom‘ as packaging.
- 【Spring】Spring boot 如何进行私有方法测试
- JDK1.8下载与安装及环境变量配置
- 解析身份证号码(附加Java代码)
- IP (网络之间互连的协议)
- 系列篇|单目结构光三维成像系统的标定方法
- codeforces 607B Zuma 区间dp
- 小布什逗留香港6小时 赴知名裁缝店做18套西装——中新网
- github项目创建
- 拼多多商品详情采集上传京东店铺(拼多多商品详情接口,京东商品详情接口,整店宝贝采集接口,一键采集宝贝详情接口,无货源商品详情采集接口)代码对接教程
- TS 中 any 和 unknown 的区别
- 使用nodejs、express以及MySQL制作一个简单类淘宝的登录注册页面