3

異なるマシン上の複数のプロセスからデータを受信して​​いる ZeroMQ ソケットがあります。データの内容を変更せずに、データのソースを特定する方法はありますか? 具体的には、TCP 接続から送信された場合、送信者の IP アドレスが必要です。

4

1 に答える 1

7

いいえ、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()のドキュメントを参照してください。

于 2013-02-01T22:09:51.903 に答える