<p>@user3666197的回答很好地讨论了ZeroMQ状态机,我认为问题在于Chapel<strong><code>ZMQ</code></strong>模块如何序列化和传输字符串。在</p>
<p>Chapel中的<a href="https://github.com/chapel-lang/chapel/blob/master/modules/packages/ZMQ.chpl#L700" rel="nofollow noreferrer">^{<cd2>}</a>和<a href="https://github.com/chapel-lang/chapel/blob/master/modules/packages/ZMQ.chpl#L775" rel="nofollow noreferrer">^{<cd3>}</a>方法通过发送两条消息来序列化字符串。这是为了匹配<a href="http://zguide.zeromq.org/page:all#A-Minor-Note-on-Strings" rel="nofollow noreferrer">ZeroMQ Guide's "Minor Note on Strings"</a>中的模式,<em>的目的是为了匹配<a href="http://zguide.zeromq.org/page:all#A-Minor-Note-on-Strings" rel="nofollow noreferrer">ZeroMQ Guide's "Minor Note on Strings"</a>中的模式,但是,在实现时,此序列化方案是不正确的,并且与某些ZeroMQ套接字模式不兼容。在</p>
<p>为了发送一个字符串,Chapel发送一个包含两个调用的多部分消息<code>zmq_send()</code>:第一个字符串大小带有{<cd5>}标志,第二个是字节缓冲区;接收的工作原理类似。这意味着你对<code>socket.recv(string)</code>的一个</em>调用实际上是在幕后对<code>zmq_recv()</code>进行两个</em>背靠背的调用。对于<code>REQ</code>/<code>REP</code>模式,这两个连续的<code>zmq_recv()</code>调用将ZeroMQ状态机置于无效状态,因此会出现错误消息。在</p>
<p>这绝对是Chapel的<code>ZMQ</code>模块的一个bug。在</p>
<p>作为参考,我是Chapel<code>ZMQ</code>模块的作者(绝对不是没有bug的)。在</p>