【Boost】boost库asio详解5——resolver与endpoint使用说明
生活随笔
收集整理的這篇文章主要介紹了
【Boost】boost库asio详解5——resolver与endpoint使用说明
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
tcp::resolver一般和tcp::resolver::query結(jié)合用,通過(guò)query這個(gè)詞顧名思義就知道它是用來(lái)查詢socket的相應(yīng)信息,一般而言我們關(guān)心socket的東東有address,port而已,通過(guò)tcp::resolver很容易實(shí)現(xiàn)設(shè)置和查詢,它通過(guò)query把字符串格式的ip如192.168.0.200或主機(jī)名http://localhost,端口“8080”等轉(zhuǎn)化成socket內(nèi)部表示格式,這樣我們應(yīng)用的時(shí)候可以直接使用字符串的形式,而且不用再擔(dān)心socket的字節(jié)順序轉(zhuǎn)化問(wèn)題。示例如下:
[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");??
還有要說(shuō)明的是, boost::asio把通訊雙方(server, client)都用endpoint的表示,所以endpoint中的address, port 分別封裝了ip和端口。貌似resolver和endpoint不相干,于是乎出現(xiàn)tcp::resolver::iterator了,它是resolver的迭代器,其實(shí)就是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后就好說(shuō)啦,endpoint.address().to_string()就能夠返回string格式的ip地址,endpoint.port()返回端口。
其實(shí)endpoint 完全可以自己構(gòu)造,方法也是很簡(jiǎn)單的, tcp::endpoint(tcp::v4(), (unsigned short)9000) 這個(gè)是server端的用法,tcp::v4()直接返回自己的address,如果用于client那么需要設(shè)置server的ip ,實(shí)現(xiàn)如下:
[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;?? }??
這樣有發(fā)現(xiàn)一個(gè)新的用途,通過(guò)resolver迭代可以得到多個(gè)節(jié)點(diǎn)endpoint,比如google 就有好幾個(gè)ip。
上面這個(gè)例子的運(yùn)行結(jié)果:
[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?
其實(shí)endpoint 完全可以自己構(gòu)造,方法也是很簡(jiǎn)單的, tcp::endpoint(tcp::v4(), (unsigned short)9000) 這個(gè)是server端的用法,tcp::v4()直接返回自己的address,如果用于client那么需要設(shè)置server的ip ,實(shí)現(xiàn)如下:
[cpp]?view plain?copy ?print?
還有更神奇的:
[cpp]?view plain?copy ?print?
上面這個(gè)例子的運(yùn)行結(jié)果:
[cpp]?view plain?copy ?print?
總結(jié)
以上是生活随笔為你收集整理的【Boost】boost库asio详解5——resolver与endpoint使用说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Boost】boost库asio详解4
- 下一篇: 【Boost】boost库asio详解6