「Boost.Asio C ++ネットワークプログラミング。」 第7章:Boost.Asio-追加トピック

みなさんこんにちは!

John Torjoの本Boost.Asio C ++ Network Programmingの翻訳を続けています。



内容:





この章では、Boost.Asioの追加トピックについて説明します。 毎日これを使用することはまずありませんが、これを知るための場違いではありません。









Asio vs Boost.Asio



Boost.Asioの作成者は、Asioのサポートも提供しました。 このライブラリにはAsio(Boostではない)とBoost.Asioの2つのフレーバーが付属しているため、Asioと考えることができます。 著者は、アップデートが最初にAsioに表示され、Boostディストリビューションに定期的に追加されると主張しています。

一言で言えば、違いは次のとおりです。



Asioの詳細については、 こちらをご覧ください

どちらのオプションを選択するかは、自分で決める必要があります。 個人的にはBoost.Asioが好きです。 選択する際に考慮すべき事項を次に示します。



1つのアプリケーションでAsioとBoost.Asioを使用できますが、これを行うことはお勧めしません。 これは意図的に機能しない場合があります。この場合、たとえば、Asioを使用し、一部のサードパーティライブラリがBoost.Asioを使用する場合、またはその逆の場合、すべてがうまくいきます。



デバッグ



一般に、同期アプリケーションのデバッグは、非同期アプリケーションのデバッグよりも簡単です。 同期アプリケーションの場合、ブロックされた場合は、デバッグを開始して、それが発生した場所の画像を取得するだけです(同期は順次を意味します)。 ただし、非同期でプログラムを作成する場合、イベントは連続して発生しないため、エラーが発生した場合、それをキャッチするのは非常に困難です。

これを避けるために、まず第一に、あなたはコルーチンで非常に良いはずです。 プログラムが正しく実装されていれば、実際には問題はまったくありません。

非同期プログラミングの場合にのみ、Boost.Asioが支援を提供します。 BOOST_ASIO_ENABLE_HANDLER_TRACKINGマクロがBOOST_ASIO_ENABLE_HANDLER_TRACKING



いる場合、 BOOST_ASIO_ENABLE_HANDLER_TRACKING



ハンドラーを追跡できます。 その場合、Boost.Asioは、時間、非同期操作、およびそれに関連する終了ハンドラーを記録することにより、標準エラー出力ストリームへの情報の出力を促進します。



ハンドラ追跡情報



情報を理解するのは簡単ではありませんが、それでも非常に便利です。 Boost.Asioの出力は次を生成します。



 @asio|<timestamp>|<action>|<description>.
      
      





最初のタグは常に@asio



、他のソースが標準エラーストリーム( std::cerr



と同等)に書き込む場合に、Boost.Asioからのメッセージを簡単にフィルタリングするために使用できます。 timestamp



インスタンスは、1970年1月1日UTCから開始する秒とマイクロ秒でカウントされます。 action



インスタンスは次のいずれかです。



n = 0の場合、すべてのハンドラーは外部(非同期)で実行されます。通常、最初の操作(操作)がいつ実行されるか、またはシグナルを操作してシグナルがトリガーされるかがわかります。

コードにエラーがあるときに発生する!n



や〜nなどのメッセージに注意する必要があります。 最初のケースでは、非同期関数は例外をスローしなかったため、例外はユーザーがスローする必要があります。最終ハンドラーを終了するときに例外を許可しないでください。 後者の場合、呼び出されたすべてのハンドラーが完了する前に、おそらくio_service



インスタンスを破棄しすぎたio_service



ます。





サポート情報の例を示すために、第6章の例を修正します。 boost/asio.hpp



オンにする前に、追加の#define



追加するboost/asio.hpp



です。



 #define BOOST_ASIO_ENABLE_HANDLER_TRACKING #include <boost/asio.hpp> ...
      
      





また、ユーザーがログインし、クライアントの最初のリストを受け取ったときにコンソールをダンプします。 結論は次のとおりです。



 @asio|1355603116.602867|0*1|socket@008D4EF8.async_connect @asio|1355603116.604867|>1|ec=system:0 @asio|1355603116.604867|1*2|socket@008D4EF8.async_send @asio|1355603116.604867|<1| @asio|1355603116.604867|>2|ec=system:0,bytes_transferred=11 @asio|1355603116.604867|2*3|socket@008D4EF8.async_receive @asio|1355603116.604867|<2| @asio|1355603116.605867|>3|ec=system:0,bytes_transferred=9 @asio|1355603116.605867|3*4|io_service@008D4BC8.post @asio|1355603116.605867|<3| @asio|1355603116.605867|>4| John logged in @asio|1355603116.606867|4*5|io_service@008D4BC8.post @asio|1355603116.606867|<4| @asio|1355603116.606867|>5| @asio|1355603116.606867|5*6|socket@008D4EF8.async_send @asio|1355603116.606867|<5| @asio|1355603116.606867|>6|ec=system:0,bytes_transferred=12 @asio|1355603116.606867|6*7|socket@008D4EF8.async_receive @asio|1355603116.606867|<6| @asio|1355603116.606867|>7|ec=system:0,bytes_transferred=14 @asio|1355603116.606867|7*8|io_service@008D4BC8.post @asio|1355603116.607867|<7| @asio|1355603116.607867|>8| John, new client list: John
      
      





各行を分析します。



慣れるまでしばらく時間がかかりますが、これを理解するとすぐに、問題を含む出力を分離し、修正が必要なコードの実際の部分を見つけることができます。



ハンドラ追跡情報をファイルに書き込む



デフォルトでは、ハンドラ追跡情報は標準エラーストリームに出力されます( std::cerr



)。 この出力を別の場所にリダイレクトする可能性が非常に高くなります。 一方、デフォルトでは、コンソールアプリケーションの場合、エラーの出力とリセットは1か所、つまりコンソールで発生します。 ただし、Windows(非コンソール)アプリケーションの場合、エラーストリームはデフォルトで空です。

次のように、コマンドラインを使用してエラー出力をリダイレクトできます。



 some_application 2>err.txt
      
      





あまりにも怠notでない場合は、次のコードフラグメントに示すように、プログラムで実行できます。



 // for Windows HANDLE h = CreateFile("err.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL , 0); SetStdHandle(STD_ERROR_HANDLE, h); // for Unix int err_file = open("err.txt", O_WRONLY); dup2(err_file, STDERR_FILENO);
      
      







SSL



Boost.Asioは、いくつかの基本的なSSL機能をサポートするクラスを提供します。 内部では、彼女はOpenSSL



を使用していOpenSSL



。 したがって、SSLを使用する場合は、まずOpenSSLをダウンロードしてビルドします 。 原則として、特にVisual Studioなどの一般的なコンパイラがない場合、 OpenSSL



構築は簡単なタスクではないことに注意してください。

OpenSSL



コンパイルに成功した場合、Boost.Asioにはいくつかのアドオンクラスがあります。




All Articles