nc 访问的 ZeroMQ IPC Unix 域套接字

ZeroMQ IPC Unix Domain Socket accessed by nc

我想通过命令 nc 连接到由 ZeroMQ(IPC 模型)创建的 Unix Domain Socket。我可以连接,但是当我发送一些消息时,正在监听这个套接字的我的守护进程没有收到任何消息...

我正在像这样使用 nc:

nc -U /path/to/socket

很好,这是一个更长的版本。

ZeroMQ 在流连接(如套接字、命名管道等)之上实现了一个消息队列传输系统。为此,它在流之上运行一个名为 ZMTP 的协议,该协议提供所有消息分界、通信图案等等。它还必须处理协议错误,以便给自己一些弹性。

与网络浏览器的比较

Web 浏览器和 Web 服务器通过套接字使用 http 进行通信的想法相同。 Http 用于传输 html 文件。如果您查看通过套接字流动的数据,您会看到 html 与 运行 http 协议中涉及的消息混合在一起。而且因为 http 是一个基于文本的协议,所以它在人眼中看起来还不错。

说同一种语言

因此,当使用 zmq 库进行通信的程序连接套接字/命名管道等时,它将期望以 ZMTP 协议定义的方式通过该连接交换数据(与 web浏览器期望使用 http 与服务器通信)。如果另一端的程序也在使用 zmq,那么他们都在谈论相同的协议,一切都很好。

不兼容的协议

但是,如果您连接的程序本身并不使用 ZMTP 协议(​​例如 Web 浏览器),并且它发送 http 请求,则它不太可能有任何意义。而 zmq 库例程无疑会接收构成 http 请求的字节,尝试对其进行解释,但无法理解,最终将其作为垃圾拒绝。

类似地,如果使用 zmq 库的程序想要发送消息,除非底层 ZMTP 协议驱动程序满足于它正在与其他使用 ZMTP 的东西进行通信,否则什么也不会发生。如果从 netcap 中出现任何东西,它看起来与您发送的消息完全不同(它会与 ZMTP 使用的字节混在一起)。

人类等效物

相当于一个叫 Bob 的英国人拿起 phone 并拨给他住在巴黎的英国朋友 Alice 的号码。但是,如果一个叫 Charlie 的法国人错误地回答了 phone(错误的号码),他们将很难交换信息。与此同时,Eve 正在窃听 phone 线路,她对这两个人未能成功沟通的无能行为大笑不已。 (我对我们英国人说任何其他语言的能力都很差做出了笼统的和部分合理的概括)。

前进的道路

ZMQ 绑定几乎适用于所有内容,甚至可能 bash。无论您想要完成什么,为您使用的编程或脚本语言获得 ZMQ 的良好绑定并使用它来提供适当的 ZMQ 端点可能是非常值得的。