zoukankan      html  css  js  c++  java
  • 【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的字节顺序转化问题。示例如下:

    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的指针,那么就可以这样:

    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。

    上面这个例子的运行结果:

    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  
  • 相关阅读:
    java 将表情转换成字符串存入数据库
    java html websocket简单实现
    Java poi读取Excel表格中公式的计算值
    转盘代码,自己搞了一个
    html5 canvas画布
    cat命令查看文件指定行数
    CentOS7 安装 gpbackup 和 gpbackup-s3-plugin 来备份和还原 Greenplum 数据库
    QT5 打包发布Release应用程序
    CentOS7 安装Redis6.0.10
    ES系列(二):基于多播的集群发现实现原理解析
  • 原文地址:https://www.cnblogs.com/johngu/p/7478650.html
Copyright © 2011-2022 走看看