4

ZeroMQ (0MQ) ソケットで recv() メソッドを介してメッセージを受信した場合...

data = s.recv()

getpeername()...基になるソケットの値を取得する方法はありますか? 私の目標は、正確な情報を提供するために送信者に依存しない方法でメッセージの発信元を特定することです.

ホスト メトリックを収集するために (Python 経由で) ZMQ を使用しています。受信者の観点から見た送信者のアドレスは、便利な識別子です。

それとも、これは単に悪い考えですか?

4

2 に答える 2

3

これは最近 github に上陸したようです: https://github.com/zeromq/libzmq/commit/3aeaa6fab135aced3e762031621491c4779285c0

于 2014-03-02T23:19:49.040 に答える
3

いいえ、ZeroMq から送信者のアドレスを取得することはできません。基本的に 2 つの選択肢があります。送信者のアドレス情報をメッセージ自体に追加するか (既存のメッセージ構造を変更できる場合は悪いオプションではありません)、送信者のアドレスをメッセージの一部として追加します。つまり、ZeroMq マルチパート メッセージを使用します。

マルチパート メッセージは全体として配信されます (すべての部分またはまったくない) が、受信側で部分を個別に抽出できるため、既存のメッセージに実際に触れることなく、送信者アドレスを追加または先頭に追加できます。 (そして、アドレスとメッセージの両方をアトミック操作として配信します)。

これが pyzmq バインディングでどのように実装されているかはわかりませんが、詳細についてはsocket.pyx ソースを確認してください (基本的に、send(..) メソッドで SNDMORE フラグを使用します)。

また、ZeroMq zmq_send() Api ドキュメント (3.2.2) もご覧ください。

C++ では、次のようになります。

// 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);
于 2013-02-11T21:19:09.160 に答える