「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








All Articles