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