我正在使用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#绑定的特质?有没有我可能错过的文件?
答案 0 :(得分:1)
这听起来像个臭虫;绝对没有记录的行为。你能把测试用例发送到zeromq-dev列表吗?最好在C中创建一个,这样我们就可以排除C#绑定。