我正在为 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# 绑定的特性?是否有任何我可能错过的文件?