【问题标题】:ZeroMQ: Check if someone is listening behind Unix domain socketZeroMQ:检查是否有人在 Unix 域套接字后面监听
【发布时间】:2011-08-11 14:01:08
【问题描述】:

上下文:Linux (Ubuntu)、C、ZeroMQ

我有一个服务器,它监听ipc:// SUB ZeroMQ 套接字(物理上是一个 Unix 域套接字)。

我有一个客户端应该连接到套接字,发布它的消息并断开连接。

问题:如果服务器被终止(或以其他方式异常终止),套接字文件将保留在原位。如果客户端尝试连接到这个陈旧的套接字,它会阻塞在zmq_term()

如果服务器不存在,我需要防止客户端阻塞,但如果服务器处于活动状态但繁忙,则保证交付。

假设我无法通过一些外部魔法(例如通过检查 PID 文件)来跟踪服务器的生命周期。

有什么提示吗?

【问题讨论】:

    标签: linux ipc zeromq unix-socket


    【解决方案1】:

    还有另一种解决方案。不要使用 ipc:// 套接字。而是使用类似 tcp://127.0.0.101:10001 的东西。在大多数 UNIX 上,这几乎与 IPC 一样快,因为操作系统识别出它是一个本地连接并缩短了完整的 IP 堆栈处理。

    【讨论】:

      【解决方案2】:

      非便携式解决方案似乎是阅读 /proc/net/unix 并在那里搜索套接字名称。

      【讨论】:

        【解决方案3】:

        如果不显示您的代码,所有这些都是猜测......也就是说......

        如果您有一个 PUB/SUB 对,PUB 将在周围徘徊以确保其消息通过。也许您没有使用正确类型的 zmq 对。听起来更像是你有一个 REP/REQ 对。

        这样,一旦您从客户端(REQ 端)连接,您可以执行zmq_poll 来确定套接字是否可用于写入。如果是,则继续您的写入,否则关闭客户端并处理错误情况(如果它是您的系统中的错误)。

        【讨论】:

        • 不,不起作用。任何套接字都可用于写入,即使它是 REP/REQ。
        【解决方案4】:

        也许您可以先尝试使用自己的本机套接字连接到套接字。如果连接成功,您的发布者很有可能可以正常工作。

        【讨论】:

          猜你喜欢
          • 2016-11-06
          • 2014-07-18
          • 2018-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-25
          • 1970-01-01
          • 2010-09-14
          相关资源
          最近更新 更多