【问题标题】:Can I mix a ZeroMQ TCP/UDP server with a regular BSD TCP/UDP socket client?我可以将 ZeroMQ TCP/UDP 服务器与常规 BSD TCP/UDP 套接字客户端混合使用吗?
【发布时间】:2019-10-20 03:16:00
【问题描述】:

我可以启动 ZeroMQ TCP/UDP 服务器并使用常规 BSD TCP/UDP 套接字客户端与其通信吗?

我有几台机器相互通信,其中一些依赖于具有低级套接字客户端的库,否则这些客户端很难迁移到 ZMQ。

【问题讨论】:

  • ZMQ 协议建立在“普通”网络之上,所以是的,如果您愿意,您可以自己实现该协议。
  • 一个名为 ZMQ_DGRAM 的未记录的新功能现在也应该允许 UDP 使用它。它需要在启用“草稿”的情况下编译库。还没找到好的例子。

标签: sockets networking zeromq


【解决方案1】:

Q“我可以启动 ZeroMQ TCP/UDP 服务器并使用常规 BSD TCP/UDP 套接字客户端与其通信吗?”

答:是的,但是...

嗯,没有什么能比得上在 ZeroMQ 中的“TCP/UDP 服务器”。 ZeroMQ 使用高级行为原型{ PUSH/PULL | PUB/SUB | REQ/REP | ... | PAIR/PAIR },为此可以选择一个或多个(是的,PUB 发件人可以将消息传递到所有vmci://ipc:// 和@ 987654325@ 和 tcp:// SUB-agents 在同一个“socket”-archetype 上)transport-classes,正因为如此,抽象的 @ 987654329@ 数据泵是隐藏但“专门”的组件,它处理所有隐藏的低级细节 - 每一个都有点不同,用于服务每个特定的 transport-class 根据需要提供各个数据泵的transport-class 特定详细信息:
{ inproc:// | ipc:// | tipc:// | tcp:// | pgm:// | epgm:// | norm:// | vmci:// }


然而,有一个“特殊的”Socket-原型可以与非 ZeroMQ 交易对手“交谈”,因此可以满足您的需求:

ZMQ_STREAM

当使用 tcp:// 传输时,ZMQ_STREAM 类型的套接字用于从非 ØMQ 对等方发送和接收 TCP 数据。 ZMQ_STREAM 套接字可以充当客户端和/或服务器,异步发送和/或接收 TCP 数据。

当接收 TCP 数据时,ZMQ_STREAM 套接字应在将消息传递给消息之前,在消息前添加一个包含原始对等方的路由 id 的消息部分。应用。收到的消息在所有连接的对等方之间公平排队。

发送 TCP 数据时,ZMQ_STREAM 套接字将删除消息的第一部分,并使用它来确定消息对等方的路由 id应该被路由到,并且无法路由的消息会导致 EHOSTUNREACHEAGAIN 错误。

要打开到服务器的连接,请使用 zmq_connect 调用,然后使用 zmq_getsockopt() 调用和 id 获取套接字路由strong>ZMQ_ROUTING_ID 选项。

要关闭特定连接,请发送路由 id 帧,后跟零长度消息。

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

您必须先发送一个路由 ID 帧,然后再发送一个数据帧。路由 id 帧需要 ZMQ_SNDMORE 标志,但在数据帧上会被忽略。

请注意传入方向上所有 ZMQ_STREAM 连接的对等方的公平队列处理。

【讨论】:

  • 非常感谢。你是真正的 ZMQ 大使!
【解决方案2】:

现在 ZeroMQ 也支持 DGRAM。见这里:zmq_udp.txt。所以除了常规的 TCP,还有常规的 UDP。

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2012-12-18
    • 2013-11-23
    • 2011-08-15
    • 1970-01-01
    • 2011-09-20
    • 2013-10-05
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多