2013-06-18 7 views
5

今私は(Zmq要求のために働く)、以下のサーバーを設定しているため、私は、ZeroMQを使用して私たちの古いサーバの再書き込みを一つにしようとしている:ZeroMQを使用して従来のソケット要求を受け入れることはできますか?

using (var context = ZmqContext.Create()) 
    using (var server = context.CreateSocket(SocketType.REP)) { 
     server.Bind("tcp://x.x.x.x:5705"); 

     while (true) { ... } 

I場合は、セットアップのこの種は、正常に動作しますcontext.CreateSocket(SocketType.REQ)

を接続するためにZmqクライアントライブラリを使用しますが、残念ながら、私たちは、このサーバーに接続する必要があり、ソケットが.NETソケットLIBSを使用して作成されたレガシーコードの多くを持っている:

Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    Socket.Connect(ipAddress, port); 

があります書き込む方法これらの伝統的な.netソケット接続を受け入れるZeroMQサーバ?

答えて

11

あなたはZMQ_STREAM socketsを使用してこれを達成することができます。

zeroMQ 4.x以降、RAWルータオプションhas been deprecatedは新しいZMQ_STREAMソケットタイプ用で、ROUTER + RAWと同じように動作します。

しかし、それは進化すると思われます。

私は最近、バージョン4.0.1でZMQ_STREAMソケットを試しました。

メッセージ全体(自分で確認する必要があります)、またはzmq_msg_rcvを受け取るまで、zmq_rcvを使用してZeroMQに処理させてください。あなたはちょうどあなたが直接1 ONLY一部が続いROUTERソケットに見つけるだろう識別子のように、識別子メッセージ部分を受信します。それらの間に空の区切り文字はありません。REQソケットがROUTERソケットと対話しているようです。したがって、ルートを指定する場合は、必ず自分で追加してください。

もう一方の待ち時間がある場合、またはメッセージがZeroMQ ZMQ_STREAMバッファ(私の8192バイト)を超える場合、メッセージは一連のメッセージとしてzeroMQによって解釈されます。

その場合、あなたは両方識別子部分ボディ部を含むなど、さまざまZeroMQメッセージを受信すると、いくつかのクライアントがSTREAMソケットに話をしている場合ことを知って、それらを集約するためにあなたの仕事です彼らは混乱するかもしれません。私は個人的にバイナリ識別子をキーとしてハッシュテーブルを使い、メッセージが完成して次のノードに送られたことを知ったときにテーブルからエントリを削除します。

ZMQ_STREAMzmq_msg_sendまたはzmq_sendに送信すると、正常に動作します。

3

zmq固有のフレーミングなしでクライアントデータに接続して読み取るには、おそらくzmqのRAWソケットタイプ(REPではなく)を使用する必要があります。 (ピーターさんのブログから)Cで

HTTP Serverの
http://hintjens.com/blog:42

RAWソケット型情報
https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55

+0

こんにちは@ラフィアン、ありがとうございますが、これを実装する方法がわかりません。 RAWのSocketTypeはありません。あなたが提供できる例がありますか? –

+1

はい、Pieterが書いたのは、http://hintjens.com/blog:42です。これは基本的にzmq rawソケットを使ったHTTPサーバーですが、C言語ですが、.netに移植できるはずです。 netは 'RAW'ソケットをサポートしています。私は純粋なJavaのzmqライブラリ(jeromq)は知っていません。 – raffian

+0

@Raffianありがとう、私はZMQのlibに直接リンクすることはできません、私はclrzmq、.NETの実装を使用しているので、これは可能ではない可能性があります –

関連する問題