ZeroMQ:检查是否有人在Unix域套接字后面监听

6

背景:Linux (Ubuntu),C,ZeroMQ

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

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

问题:如果服务器被杀死(或以其他不正常的方式死亡),套接字文件将保持原地。如果客户端尝试连接到这个陈旧的套接字,它会在 zmq_term() 中阻塞。

我需要防止客户端因服务器不存在而阻塞,但如果服务器存活但繁忙,则需要保证传递。

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

有什么提示吗?

4个回答

4

一个非可移植的解决方案是读取 /proc/net/unix 并在其中搜索套接字名称。


1

没有展示你的代码,所有这些都是猜测...话虽如此...

如果你有一个 PUB/SUB 对,PUB 会一直等待确保它的消息被传递。也许你没有使用正确类型的 zmq 对。听起来更像是 REP/REQ 对。

这样,一旦你从客户端(REQ 端)连接,你可以使用 zmq_poll 来确定套接字是否可用于写入。如果是,则继续进行写操作,否则关闭客户端并处理错误条件(如果是系统中的错误)。


不行,不起作用。任何套接字都可以用于写入,即使它是REP/REQ类型的。 - Alexander Gladysh

1

还有另一种解决方案。不要使用 ipc:// sockets。相反,使用类似于 tcp://127.0.0.101:10001 的内容。在大多数 UNIX 上,这几乎与 IPC 一样快,因为操作系统识别它是本地连接并快捷处理完整的 IP 栈。


0
也许你可以先尝试使用自己本地的套接字连接。如果连接成功,那么你的发布者很有可能能够正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接