1

zmq に C# バインディングを使用していますが、ソケットが接続されているかバインドされているかによって、sndmore と noblock の動作が異なることに気付きました。

エンドポイントにクライアントが接続されていない場合、最初の送信で次のシナリオがブロックされます。

        Context zmqContext = new Context(1);
        Socket zmqSocket = zmqContext.Socket(<any socket type>);

        zmqSocket.Bind("tcp://*:5555");

        zmqSocket.Send("hello", Encoding.UTF8, SendRecvOpt.SNDMORE);
        zmqSocket.Send("world", Encoding.UTF8, SendRecvOpt.SNDMORE);
        zmqSocket.Send("ok, I'm done!", Encoding.UTF8, SendRecvOpt.NOBLOCK);

エンドポイントに何もない場合、これはまったくブロックされませんが:

        Context zmqContext = new Context(1);
        Socket zmqSocket = zmqContext.Socket(<any socket type>);

        zmqSocket.Connect("tcp://localhost:5555");

        zmqSocket.Send("hello", Encoding.UTF8, SendRecvOpt.SNDMORE);
        zmqSocket.Send("world", Encoding.UTF8, SendRecvOpt.SNDMORE);
        zmqSocket.Send("ok, I'm done!", Encoding.UTF8, SendRecvOpt.NOBLOCK);

あるシナリオではすべての送信で noblock フラグを使用しなければならないのに、別のシナリオでは最後の送信でのみ使用する必要があるのは少し奇妙に思えます。これに関連するzmqのドキュメントには何も見つかりません。これがzmqの意図的な動作なのか、それともC#バインディングの特異性なのか、誰か教えてもらえますか? 私が見逃したかもしれないこれに関するドキュメントはありますか?

4

1 に答える 1

1

バグのように聞こえます。間違いなく文書化された動作ではありません。テスト ケースを zeromq-dev リストに送信できますか? C# バインディングを除外できるように、C で作成するのが最善です。

于 2013-04-25T18:28:19.360 に答える