日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Boost】boost库asio详解5——resolver与endpoint使用说明

發(fā)布時(shí)間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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??
  • 總結(jié)

    以上是生活随笔為你收集整理的【Boost】boost库asio详解5——resolver与endpoint使用说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。