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 回答