resolve的用法和endpoint淺析)

來源:互聯網
上載者:User

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 ;

 
tcp::resolver resolver (io_service );

 
tcp::resolver::query query ("localhost" , "9000" );

還有要說明的是,boost::asio把通訊雙方(server,client )都用endpoint 的表示,所以endpoint中的address ,port 分別封裝了ip , 和連接埠。貌似resolver和endpoint不相干,於是乎出現tcp::resolver::iterator了,它是resolver的迭代器,其實就是endpoint的指標,那麼就可以這樣:

tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

tcp::resolver::iterator end ;

boost::system::error_code error = boost::asio::error::host_not_found;

tcp::endpoint endpoint ;

//if(error)

// cout << "  error is true ! \n";

while (error && endpoint_iterator != end)

    {

 
  endpoint = *endpoint_iterator ;

      socket.close();

      socket.connect(endpoint, error);

      endpoint_iterator++ ;

    }

得到endpoint後就好說啦,endpoint.address().to_string()就能夠返回string格式的ip地址,short 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 ;

 
tcp::resolver resolver(my_io_service);

 

    tcp::resolver::query query("www.google.com", "http");

    tcp::resolver::iterator iter = resolver.resolve(query);

    tcp::resolver::iterator end; // End marker.

while (iter != end)

{

  tcp::endpoint endpoint = *iter++;

  std::cout << endpoint << std::endl;

}

這樣有發現一個新的用途,通過resolver 迭代可以得到多個節點endpoin,比如google 就有好幾個ip 。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.