【Boost】boost库asio详解5——resolver与endpoint使用说明
来源:互联网 发布:小米手机自动更新软件 编辑:程序博客网 时间:2024/05/29 13:41
转载地址:http://blog.csdn.net/huang_xw/article/details/8502895
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::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++ ;
- }
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);
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;
- }
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
0 0
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- boost库asio详解5——resolver与endpoint使用说明
- boost库asio详解5——resolver与endpoint使用说明
- 【Boost】boost库asio详解4——deadline_timer使用说明
- 【Boost】boost库asio详解4——deadline_timer使用说明
- 【Boost】boost库asio详解4——deadline_timer使用说明
- 【Boost】boost库asio详解4——deadline_timer使用说明
- boost库asio详解4——deadline_timer使用说明
- Boost Asio之Resolver
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
- 【Boost】boost库asio详解7——boost::asio::buffer用法
- 【Boost】boost库asio详解——boost::asio::buffer用法
- 【Boost】boost库asio详解7——boost::asio::buffer用法
- 【Boost】boost库asio详解6——boost::asio::error的用法浅析
- 【Boost】boost库asio详解7——boost::asio::buffer用法
- top命令
- zoj2770
- 一种利用js实现的仿淘宝商品评价功能的方法
- 为什么读研
- IOS8 alertView 和 actionSheet 使用方法
- 【Boost】boost库asio详解5——resolver与endpoint使用说明
- 贪心算法介绍
- 数据库多表连接,返回结果集
- 两段shell脚本,监控进程和主动结束进程
- Git---强大的版本控制工具
- Project2--Lucene的Ranking算法修改:BM25算法
- Linq:基本语法group by, order by ,into(3)
- Redis常用命令
- Java web测试分为6个部分