#はじめに
message_queueを使うと、別プロセス間(それぞれ別に起動している異なるアプリ間など)で簡単に通信をすることができます。
#準備
送受信するデータ構造を定義しておきます。
データ構造の定義
struct Data {
.....
};
なんでもいいです。ただし、送受信側両方で知っておく必要があります。
#受信
受信用キューを作成します。
キュー作成
// キュー作成。識別用として、固有のキーを指定します
boost::interprocess::message_queue msgq( boost::interprocess::create_only, "UNIQUE_KEY_HOGEHOGE", max_msg_num, sizeof(Data) );
受信をします
受信
Data message;
uint64_t recv_size;
unsigned priority;
msgq.receive( &message, sizeof(Data), recv_size, priority );
タイムアウト付き受信もあります
タイムアウト付き受信
// タイムアウト「時刻」を指定するようです
boost::posix_time::ptime timeout = boost::posix_time::microsec_clock::universal_time() + boost::posix_time::milliseconds( 100 ); // 今から100ms後
if ( msgq.timed_receive( &message, sizeof(Data), recv_size, priority, timeout ) ) {
// 受信成功
} else {
// タイムアウト
}
#送信
次は送信です。
キュー作成
boost::interprocess::message_queue msgq( boost::interprocess::open_only, "UNIQUE_KEY_HOGEHOGE" );
送信
Data data
data.xxx = xxxxx;
..
msgq.send( &data, sizeof(Data), 0 );
受信と同様にタイムアウト付きのtimed_sendなどもあります。
#おわりに
送信も受信も、失敗すると例外を投げてくるので、実際はtry~catchを使ってエラー処理します。
クライアント・サーバー型で送受信する場合の例ですが、
例えばサーバー側では公開した固有のキーで受信待ちループを回しておき
クライアントは、そのキーめがけて送信します。このとき、送信データの中にクライアント自身が生成した受信用固有キーを入れておきます。
サーバーは受信後、その受信用固有キーに対して返信する、という方法で1対多の接続をさばくことができます。
以上、boost::interprocess::message_queueの基本的な使い方をご紹介しました。