ZMQ:连接zmq套接字时“资源暂时不可用”

时间:2017-08-07 18:06:55

标签: python c++ sockets ipc zeromq

我试图通过czmqz(4.0.2)使用libzmq(4.2.2)在Python程序和我的C ++应用程序之间建立IPC通信通道。

我正在使用ZMQ发布者/订阅者模式,其中Python程序绑定到端口并使用pyzmq(16.0.2)发布消息,而我的C ++程序使用来自CZMQ的zsock class作为连接订户。

问题是,每当我的订户尝试连接时,我都会收到错误代码11,资源暂时不可用。奇怪的是,这个系统似乎在我的开发机器上运行得很好,但在我正在部署的目标系统上却没有。

问题出现在以下删节方法初始化套接字的第一行:

bool ZmqSocketWrapper::connectSubscriber(string address)
{
    m_address = address;
    m_pSocket = zsock_new_sub(address.c_str(), "");

    int errorCode = zmq_errno();
    if (errorCode != 0)
    {
        printf(zmq_strerror(errorCode));
        return false;
    }

    return true;
}

这称为如下:

m_subscriberSocket->connectSubscriber("tcp://127.0.0.1:5555");

我也尝试了其他变体,结果相同:

m_subscriberSocket->connectSubscriber("tcp://localhost:23232");
m_subscriberSocket->connectSubscriber("ipc:///tmp/test");

在网上搜索时,似乎大多数其他人在尝试发送/接收时都有这个问题,所以当我试图打开套接字时,我有这个问题似乎很奇怪。

其他一些细节:

  • 我的ZMQ发布者使用pyzmq在Python中编写,并且在同一目标系统上工作正常,这表明问题出在czmq中。
  • 我遇到问题的机器是Raspberry Pi,如果有相关的话,尽管请记住上述观点。
  • 不,没有其他人正在使用该端口,我已经确认使用netstat服务器端口正在侦听。
  • 是的,我尝试过以root身份运行我的客户端。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

好消息是纯粹的pyzmq场景正常,

硬件或操作系统相关问题似乎已从故障列表中排除。

诅咒绑定(盲目用户程序通过“高级”倾斜 - abstration)

首先,是 一些高级实业家推动逃避原生API,取消了用户方面的选择。

CZMQ就是这样做的,因为它假定每个SUB - 想要只是.connect() ,而不是离开{ {1}}可供选择。旧的好ZeroMQ API总是让用户选择这个选项,这是公平的。类似地,有许多性能调优变量需要在设置套接字连接之前设置,这使得“高级”绑定对于分布式系统实现更加麻烦。

接下来是奇怪的事情,代码在一个盒子上运行正常,而不是另一个盒子。

我担心用户责任是将.bind()/.connect()设置为零+ LINGER任何此类创建的.close()套接字(如果没有适当的异常处理,则不需要这样做)SUB实例安全zmq.Context()之前 - 已经过了。这可能会导致以后导致真实资源(仍然)被占用的孤儿,导致.term()代码11, errno

最后但并非最不重要 - 资源不是消耗品/一次性用品

建议的代码无法更好地展示此类资源的低效行为,并累积每次调用的所有设置/配置/拆卸开销成本。这是一种非常糟糕的设计实践(用户可能会在许多“教科书”示例中遇到它)。如果对有效的分布式计算参数的更多细节感兴趣,也与此相关, may also like this post.

Resource temporarily unavailable.

如果遇到麻烦,

使用本机API,您的代码可以完全控制舞台。