5

ZMQ (2.2) を主要な通信層として使用するプラットフォームを開発してきました。今週初めに、zeromq Web サイトのアドバイスを受けて、最新の安定ビルド 3.2.2 にアップグレードすることにしました。

しかし、新しい API への更新に苦労した後、Windows XP (SP3) マシンで libzmq ライブラリをロードできないという clrzmq バインディングに問題があるように見えることを発見して、非常に失望しました。SEHException 例外が発生し続けますか?!

誰かが同じ問題を抱えているかどうか、そしてそれに対する回避策(またはさらに良い修正)があるかどうか疑問に思っていましたか?

乾杯 :)

EDIT 明確にするために、ライブラリは正常にロードされています。これは、コンテキストが問題なく作成されているためです。この問題は、コンテキストで CreateSocket メソッドが呼び出されたときに発生します...以下のコード スニペットを参照してください

        ZmqContext context = ZmqContext.Create();

        ZmqSocket socket = context.CreateSocket(SocketType.REQ);

Jakob の提案に従ってトレースを追加すると、次の出力が得られます

Assertion failed: Connection refused (..\..\..\src\signaler.cpp:310)

これは何を意味するのでしょうか?

EDIT また、この問題はすべての XP マシンで発生するわけではなく、一部のマシンでのみ発生することにも言及する必要があります。動作するマシンと動作しないマシンの違いを理解しようとしています。これを知らなければ、アップグレードして本番環境にリリースするのは非常に危険です。

4

1 に答える 1

1

あなたが提供した例を見ると、REQソケット(リクエスト、つまりクライアントソケット)にバインドしており、ワイルドカードを使用してREQソケットもバインドしています。これがどうなるかはわかりませんが、私には意味がありません。これはサポートされていないと思いますが、REQ ソケットへのバインドに関するドキュメントが見つからないか覚えていません。おそらく奇妙なことが起こるでしょう。

REP (応答) ソケットは、REQ/REP セットアップ (要求/応答) の「サーバー」側であり、bindエンドポイントへの REP ソケットを使用するサーバー側で、「tcp://127.0.0.1:5555」を明示的に指定します。 " またはワイルドカードを使用します (例: "all interfaces"、"tcp://*:5555")。クライアント側はconnect、明示的なエンドポイント アドレス「tcp://127.0.0.1:5555」への REQ ソケットを使用します。ワイルドカードは使用しません。

サーバーはこれを行います:

ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REP);
socket.Bind("tcp://*:5501");

そしてクライアントはこれ:

ZmqContext context = ZmqContext.Create();
ZmqSocket socket = context.CreateSocket(SocketType.REQ);
socket.Connect("tcp://127.0.0.1:5501");

これらの問題とは別に、ファイアウォールがブロックしていないことを確認し、ポートがまだ使用されていないことを確認する必要があります (たとえば、NETSTAT コマンドを使用)。

ZeroMq アドレッシング ルールについては、zmq_tcp API ドキュメントを参照してください。ソケットについては、zmq_socket API ドキュメントを参照してください。

于 2013-02-07T19:28:45.050 に答える