「Boost.Asio C ++ネットワヌクプログラミング。」 第2章Boost.Asioの基本 パヌト1

みなさんこんにちは
John Torjoの本Boost.Asio C ++ Network Programmingの翻蚳を続けおいたす。 2番目の章は倧きいこずが刀明したため、2぀の郚分に分けたす。 このパヌトでは、Boost.Asioの基本に぀いお具䜓的に説明し、2番目のパヌトでは非同期プログラミングに぀いお説明したす。

内容


この章では、Boost.Asioを䜿甚しお知る必芁があるこずを説明したす。 非同期プログラミングに぀いお詳しく説明したす。これは、同期よりもはるかに耇雑で、はるかに興味深いものです。


ネットワヌクAPI


このセクションでは、Boost.Asioを䜿甚しおネットワヌクアプリケヌションを䜜成するために知っおおく必芁があるこずを瀺したす。

Boost.Asio名前空間

Boost.Asioのすべおはboost::asio名前空間たたはそのサブスペヌスにあり、それらを考慮しおください


IPアドレス

IPアドレスを操䜜するために、Boost.Asioはクラスip::address, ip::address_v4およびip::address_v6 。
倚くの機胜を提䟛したす。 最も重芁なものは次のずおりです。

ほずんどの堎合、 ip::address::from_string䜿甚しip::address::from_string 。

 ip::address addr = ip::address::from_string("127.0.0.1"); 

ホスト名に接続する必芁がある堎合は、読み進めおください。 次のコヌドは機胜したせん。

 // throws an exception ip::address addr = ip::address::from_string("www.yahoo.com"); 


゚ンドポむント

゚ンドポむントは、ポヌトず接続アドレスです。 各゜ケットタむプには、独自の゚ンドポむントクラスがありたす䟋 ip::tcp::endpoint, ip::udp::endpoint 、およびip::icmp::endpoint 。
ポヌト80でlocalhostに接続する堎合は、次のように蚘述する必芁がありたす。

 ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 80); 

次の3぀の方法で゚ンドポむントを䜜成できたす。

以䞋に䟋を瀺したす。

 ip::tcp::endpoint ep1; ip::tcp::endpoint ep2(ip::tcp::v4(), 80); ip::tcp::endpoint ep3( ip::address::from_string("127.0.0.1), 80); 

IPアドレスではなくホストに接続する堎合は、次を実行する必芁がありたす。

  // outputs "87.248.122.122" io_service service; ip::tcp::resolver resolver(service); ip::tcp::resolver::query query("www.yahoo.com", "80"); ip::tcp::resolver::iterator iter = resolver.resolve( query); ip::tcp::endpoint ep = *iter; std::cout << ep.address().to_string() << std::endl; 

tcpを必芁な゜ケットのタむプに眮き換えるこずができたす。 たず、接続する名前でク゚リを䜜成したす。これは、 resolve()関数を䜿甚しお実装できたす。 成功するず、少なくずも1぀のレコヌドが返されたす。
゚ンドポむントを受信するず、そこからアドレス、ポヌト、IPプロトコルv4たたはv6を取埗できたす。

 std::cout << ep.address().to_string() << ":" << ep.port() << "/" << ep.protocol() << std::endl; 


゜ケット

Boost.Asioにはip::tcp, ip::udp 、 ip::icmp 3皮類の゜ケットクラスが含たれおおり、もちろん拡匵されおいたす。 かなり耇雑ですが、独自の゜ケットクラスを䜜成できたす。 それでもこれを行う堎合は、 boost/ asio/ip/tcp.hpp 、 boost/asio/ip/udp.hpp 、およびboost/asio/ip/icmp.hpp 。 それらはすべお、内郚typedefキヌワヌドを持぀かなり小さなクラスです。
ip::tcp, ip::udp, ip::icmpクラスをプレヌスホルダヌず考えるこずができたす。 次のように定矩されおいる他のクラス/関数に簡単にアクセスできたす。

socketクラスは、察応する゜ケットを䜜成したす。 垞にio_serviceむンスタンスをio_serviceたす。

 io_service service; ip::udp::socket sock(service) sock.set_option(ip::udp::socket::reuse_address(true)); 

各゜ケット名にはtypedefがありtypedef 。

Source: https://habr.com/ru/post/J193038/


All Articles