【问题标题】:zmq_send() blocks on recv()/poll()recv()/poll() 上的 zmq_send() 块
【发布时间】:2021-11-15 06:28:17
【问题描述】:

我尝试通过 inproc 对套接字发送一些小(8 字节)消息。然而,经过几次尝试 zmq_send() 块。当我停止调试器时,我看到以下堆栈跟踪:

libc.so.6!__GI___poll(struct pollfd * fds, nfds_t nfds, int timeout) 
libzmq.so.5!poll(int __timeout, nfds_t __nfds, pollfd * __fds) 
libzmq.so.5!zmq::signaler_t::wait(zmq::signaler_t * const this, int timeout_) 
libzmq.so.5!zmq::mailbox_t::recv(zmq::mailbox_t * const this, zmq::command_t * cmd_, int timeout_) 
libzmq.so.5!zmq::socket_base_t::process_commands(zmq::socket_base_t * const this, int timeout_, bool throttle_) 
libzmq.so.5!zmq::socket_base_t::send(zmq::socket_base_t * const this, zmq::msg_t * msg_, int flags_) 
libzmq.so.5!s_sendmsg(int flags_, zmq_msg_t * msg_, zmq::socket_base_t * s_) 
libzmq.so.5!zmq_send(void * s_, const void * buf_, size_t len_, int flags_)

为什么会这样? ZMQ 尝试处理哪些命令?为什么它调用recv()?是因为水位高吗?我想这是不同的,因为我发送了少量数据并且还没有达到水印。如果水印是唯一的解释,那我该如何衡量呢?

【问题讨论】:

  • 您使用的是什么类型的 zmq_socket?你指定了什么标志?该行为非常特定于袜子类型。
  • 没有看到你的代码很难猜出哪里出了问题。请edit您的问题并显示minimal reproducible example
  • @ChrisDodd 它是 inprox 对,如问题所示。没有标志。
  • @Bodo 我会尝试,但代码相当大。我观察到 _pipe 是 NULL 所以 zmq::pair_t::xsend() 返回 -1。

标签: c zeromq


【解决方案1】:

一般来说,当套接字对未完成的发送数据达到某种限制时,就会发生这种情况;然后它将阻止等待允许它继续的确认消息。

具体行为取决于 zmq_socket 类型以及您对其进行的任何其他配置(例如,设置高水位线)。

【讨论】:

    【解决方案2】:

    原来这是我的代码逻辑中的错误。发送一些消息后,接下来由不同的线程使用不同的套接字发送。该套接字未连接,因此 zmq_send() 正在等待建立连接。这就是它的管道为 NULL 的原因。谢谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多