【问题标题】:Reason for zmq error code 156384763zmq 错误代码 156384763 的原因
【发布时间】:2018-09-18 21:24:42
【问题描述】:

我正在使用 zmq req/rep 模式通信。实现非常简单,req 发送一些数据并等待 recv。代表接收数据、处理并回复。

//REQ
zmq_connect
zmq_send
zmq_recv //blocking
zmq_close

//REP
zmq_bind
while(true) {
  while(data_received) {
    //miscellaneous process
    zmq_recv //non-blocking
      Print zmq_error_no if zmq_recv fails
  }
  zmq_send
}

在 REP 端,在 zmq_recv 超时期间 zmq_error_no 11 将被打印。但有时我收到错误号 156384763。有人能说出该错误的含义吗?

【问题讨论】:

标签: c++ sockets zeromq


【解决方案1】:

这是原生 ZeroMQ 错误 EFSM:

zmq_send() 操作目前无法在此套接字上执行,因为套接字未处于适当的状态。在多个状态之间切换的套接字类型可能会出现此错误,例如 ZMQ_REP。

来源:zmq_send、zmq.h

【讨论】:

  • 在某些情况下尝试从 REP 套接字接收消息时也会出现此错误。从这一刻起,服务器上的 REP 套接字上的接收操作一直失败并出现此错误,直到您再次发送一些数据。这实际上意味着您的服务器正在崩溃和烧毁。所有其他客户端/请求套接字都没有得到服务!在 REP/服务器端处理此错误的最佳做法是什么?
【解决方案2】:

这是EFSM 错误的另一个受害者,当从REP 套接字接收时出现。

对我来说,直接原因是没有回答客户提出的一些请求。 请记住,消息模式严格要求您发送回复! 如果你不这样做,那么服务器就会变得混乱并停止工作。

那么,这在实践中怎么会发生呢?

好吧,您可能会发现自己正在将旧协议移植到 ZeroMQ(就像我一样)。原作者根本懒得回复某些请求。 因此,一旦您遇到这样的请求,服务器就会中断。

或者想象在处理特定有问题的请求时,您的代码中发生了异常。然后我们可以不经意间跳过我们的发送回复消息代码!

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多