2012-03-07 10 views
3

私はZeroMQ(0MQ)ソケット上のrecv()メソッドを介してメッセージを受信した場合は...ZMQメッセージの発信元を特定していますか?

data = s.recv() 

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

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

これは単なる悪い考えですか?

+1

は、GUIDの送信者の識別子ではなくデータでありますそれ以外の場合は 'getpeername'で収集します。以下のリンクを参考にしてください:http://lists.zeromq.org/pipermail/zeromq-dev/2011-June/012041.html –

答えて

2

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

複数の部分のメッセージは引き続き配信されますが(すべての部分またはすべてではありません)、受信側で個別に抽出することができるため、送信者のアドレスを既存のメッセージに追加または追加することができますそれらに実際に触れることなく(そして、アトミック操作としてアドレス+メッセージの両方を配信します)。

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

さらに、ZeroMq zmq_send() Api docs(3.2.2)をご覧ください。 C++で

、それは次のようになります。これは最近のGitHubに上陸したよう

// 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); 
関連する問題