【问题标题】:Detecting socket connection using ZeroMQ STREAM sockets使用 ZeroMQ STREAM 套接字检测套接字连接
【发布时间】:2018-07-17 01:46:56
【问题描述】:

我正在构建一个新应用程序,该应用程序从多个外部设备接收数据,并且需要使其可用于多个不同的组件。 ZeroMQ 似乎是为我的架构的“数据总线”方面专门构建的。

我最近意识到 zmq STREAM 套接字可以连接到本地 TCP 套接字并发送/接收消息。始终使用 zmq 有很大的吸引力,但我有一个问题我不知道如何解决。

需要设置我的一个设备。也就是说,我将一个套接字连接到它,向它发送一些配置信息,然后坐等它向我发送数据。该设备还具有“重置”功能(在某些情况下很有用),这需要重新发送配置信息。这样做取决于对套接字接口的设置/拆卸阶段的可见性。我需要知道何时建立新连接,以便发送必要的配置消息。

zmq 似乎是故意设计来保护我免受这些知识的影响。有没有办法做我想做的事?还是应该只为这个接口使用常规套接字?

【问题讨论】:

    标签: zeromq


    【解决方案1】:

    好吧,事实证明,阅读(正确版本的)精美手册可以很有启发性。

    建立连接后,应用程序将收到一条长度为零的消息。同样,当对端断开连接(或连接丢失)时,应用程序将收到一条长度为零的消息。

    我想剩下的就是消除连接和断开之间的歧义。如果其他人以前处理过这种情况,仍在寻求社区的建议。

    【讨论】:

      【解决方案2】:

      根据您自己的答案,我会犹豫是否将零长度连接/断开消息作为您的整个策略——这似乎是不必要的脆弱。从您的问题中我不清楚哪一端是持久的,哪一端需要配置信息,但我希望一端 知道它正在重置和重新连接,并且那一端 需要 配置来自对等方的信息,因此它应该在需要时通过消息询问,对等方会用所请求的信息对其进行响应。

      如果对等方在收到其他消息之前还没有所需的配置信息,它可以将该工作排队,也可以响应配置的需要,然后让网络的其余部分处理需要适当的。

      您不应该需要流/tcp 套接字来使其工作,它应该与更标准的 ZMQ 套接字类型一起工作,您只需要在应用程序中构建健壮性,而不是试图从 TCP/套接字操作中免费获得它.

      如果我错过了您的观点,并且我的建议由于某种原因不起作用,您将必须提供有关您的网络拓扑的更具体信息,以便其他人了解合适的解决方案可能是什么。

      【讨论】:

      • 谢谢,如果我的问题不够清楚,我深表歉意。我的应用程序的各个部分将自始至终使用 ZMQ。这是一些使用 TCP 套接字的外部硬件的接口点。他们希望硬件用户编写“连接和初始化”代码。虽然 ZMQ 允许与 TCP 套接字集成,但它不能很好地支持“连接和初始化”。我发现的东西,虽然看起来很脆弱,但至少有记录。如果有更好的方法来支持 TCP“连接和初始化”语义,我很感兴趣。
      • 啊,这有帮助 - 您无法控制设备的行为。我假设您在应用程序中的流套接字上使用bind-ing,并将其视为持久服务器,而不是在需要设置新连接时主动管理它,对吗?设备重新启动,只知道建立与您的应用程序的 TCP 连接,然后等待配置,句号?设备是否可以处理接收配置以外的任何内容,或者如果您在等待配置时发送某些内容,它是否会优雅地抱怨?您或许可以使用心跳来检查设备状态。
      • 不,设备是服务器。我connect 给它。它接受连接,然后必须配置连接以告诉它要发送什么数据。所以我需要知道 ZMQ 何时建立新连接。
      • 那我还是错过了什么。为什么您的应用程序建立连接时不能只发送配置?
      • 是的,这就是重点。执行 ZMQ connect 不一定会立即建立连接。它一直等到设备接受一个(必要时重试)。而且,如果设备重置,它将静默重新连接。我需要检测这些事件,以确保每次连接设备时都对其进行配置。
      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2012-12-10
      • 2011-09-18
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多