異なるマシン上の複数のプロセスからデータを受信している ZeroMQ ソケットがあります。データの内容を変更せずに、データのソースを特定する方法はありますか? 具体的には、TCP 接続から送信された場合、送信者の IP アドレスが必要です。
1 に答える
いいえ、ZeroMq ソケットから送信者の IP を取得する方法はありません。その情報は、ZeroMq の実装レイヤー内に隠されています。これを解決するには、いくつかの選択肢があります。1 つは、渡されるメッセージを変更し、単に送信者の IP をメッセージ自体に追加することです。もう 1 つは、マルチパート メッセージを使用することです。
ZeroMq zmq_send() APIドキュメント (3.2.2) から:
ØMQ メッセージは、1 つ以上のメッセージ部分で構成されます。各メッセージ部分は、それ自体が独立した zmq_msg_t です。ØMQ は、メッセージのアトミック配信を保証します。ピアは、メッセージのすべてのメッセージ部分を受信するか、まったく受信しないかのいずれかになります。メッセージ パーツの総数は、使用可能なメモリを除いて無制限です。
マルチパート メッセージは、実際にはアトミック メッセージですが、複数の論理メッセージに分かれています。つまり、すべての部品を受け取るか、部品をまったく受け取りません。元のメッセージを変更できない場合は、(送信側で) メッセージの前に送信者の IP を追加できます。受信者は、最初の部分を送信者の IP として抽出し、2 番目の部分を元の変更されていないメッセージとして抽出できます。メッセージは 1 つのメッセージとして配信されますが、論理的には 2 つの個別の部分に分けられます。
あなたの場合、次のようなことができます:
// Send a multi-part message consisting of sender IP plus another message
zmq_msg_send (&my_ip, my_socket, ZMQ_SNDMORE);
zmq_msg_send (&my_message, my_socket, 0);
レシーバーについては、zmq_msg_recv()のドキュメントを参照してください。