根据套接字是连接还是绑定,ZMQ SNDMORE和NOBLOCK的交互方式不同

时间:2012-08-02 08:38:20

标签: c# zeromq

我正在使用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#绑定的特质?有没有我可能错过的文件?

1 个答案:

答案 0 :(得分:1)

这听起来像个臭虫;绝对没有记录的行为。你能把测试用例发送到zeromq-dev列表吗?最好在C中创建一个,这样我们就可以排除C#绑定。

相关问题