MSYS2/mingw64 で boost/asio を使う場合の要点

MSYS2 では、BSD ソケットの API を使う場合は、msys2 環境で行う必要があり、
mingw32/64 環境では、windows 依存の WinSock2 などを使う必要がある。
※WinSock は、BSD ソケットに似ているが、完全に同じではなく、BSD ソケット
用に書かれたソースコードをそのままコンパイルする事は出来ない。

そこで、今後の互換性(マルチプラットホーム)や、発展性を考えて、boost/asio
を使う事にした。
mingw32/64 では、boost の環境依存ライブラリーをパッケージマネージャーで簡
単に導入できるので、コンパイルする必要も無い。
多くのサンプルが、VC環境の場合が多く、MSYS2 環境で、gcc や clang での利
用方法が少ないので、覚書程度に要点をまとめてみた。

まず、boost をインストールする。
現在は、

 % pacman -Ss boost
mingw32/mingw-w64-i686-boost 1.63.0-1
    Free peer-reviewed portable C++ source libraries (mingw-w64)
mingw64/mingw-w64-x86_64-boost 1.63.0-1 [インストール済み]
    Free peer-reviewed portable C++ source libraries (mingw-w64)

「1.63.0-1」がカレントのようだ。

※インストールする場合

 pacman -S mingw-w64-x86_64-boost

-----
サーバー、クライアントのサンプルは、TCP - boostjpが判りやすい。

コンパイルの際に注意する点として:

-DWIN32 -DBOOST_USE_WINDOWS_H -DWIN32_LEAN_AND_MEAN

を定義しておく必要があるようだ。

また、リンク時のライブラリーは、

boost_system-mt ws2_32 wsock32

をリンクする必要がある。
※OS-X や Linux 環境では、「boost_system-mt」だけリンクすれば大丈夫だ。

あと、boost が出力するエラーメッセージは、日本語化されているのは良いのだが
CP932(ShiftJIS)な為、UTF-8 などに変換する必要がある。
※もしかしたら、UTF-8 を標準にする切り替えが出来るのかもしれないが調べてい
ない、ただ、コンパイルし直す必要があるかもしれない・・

-----
コネクション(同期関数利用)の際に、エラーが発生した場合に、エラーステート
か、例外の補足を選択できるようだが、私の環境依存なのか、コアダンプが出て正
常に動作しなかった、async_connect にしたら、問題は解決した。
※mingw64 の boost 絡みのバグなのかもしれない・・・
※OS-X で同じプログラムを動作させると、問題無く動作した。

あと、asio を使ったサンプルは、動作しないものもあるようなので、注意が必要と
思う。
サーバーとクライアントが不明確だったり、関係性を説明していないものも多く、
単純には動作しないものもある。

基本的に、TCPでは、サーバーを動作させて待機しておき、クライアントが接続に
行くスタイルなので、単純に繋げて、データをやりとりする事は出来ない。
少なくとも、サーバーとクライアントのプログラムを実装する必要がある。

boost::asio は使ってみると、良く出来ていると感じる、それでも、タイムアウトし
た場合のケアなど、かなり前もって緻密に設計しておかないと、後で苦労しそうでは
ある。
また、例外でエラーを受け取るのは、ソケットの場合、以外と相性が悪いかもしれな
い。
※非同期で行う場合は特にそう感じる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください