【Boost】boost库asio详解5——resolver与endpoint使用说明
生活随笔
收集整理的這篇文章主要介紹了
【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的字節順序轉化問題。示例如下:
[cpp]?view plain?copy ?print? 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的指針,那么就可以這樣:
[cpp]?view plain?copy ?print? 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 ,實現如下:
[cpp]?view plain?copy ?print? 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也是可以的。
還有更神奇的:
[cpp]?view plain?copy ?print? 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。
上面這個例子的運行結果:
[cpp]?view plain?copy ?print? 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??
[cpp]?view plain?copy ?print?
[cpp]?view plain?copy ?print?
其實endpoint 完全可以自己構造,方法也是很簡單的, tcp::endpoint(tcp::v4(), (unsigned short)9000) 這個是server端的用法,tcp::v4()直接返回自己的address,如果用于client那么需要設置server的ip ,實現如下:
[cpp]?view plain?copy ?print?
還有更神奇的:
[cpp]?view plain?copy ?print?
上面這個例子的運行結果:
[cpp]?view plain?copy ?print?
總結
以上是生活随笔為你收集整理的【Boost】boost库asio详解5——resolver与endpoint使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库asio详解4
- 下一篇: 【Boost】boost库asio详解6