首页 > 解决方案 > 我可以将 ZeroMQ TCP/UDP 服务器与常规 BSD TCP/UDP 套接字客户端混合使用吗?

问题描述

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

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

标签: socketsnetworkingzeromq

解决方案


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

答:是的,但是...

好吧,在 ZeroMQ中没有什么比得上TCP/UDP 服务器”了。ZeroMQ 使用高级行为原型{ PUSH/PULL | PUB/SUB | REQ/REP | ... | PAIR/PAIR },人们可以为此选择一个或多个(是的,PUB发送者可能会一次将消息传递给同一“套接字”原型中的所有vmci://andipc://和-agents )pgm://,这是因为事实,抽象的数据泵是隐藏但“专门”的组件,它处理所有隐藏的低级细节 - 每个都有点不同,用于根据需要为每个特定的传输类提供单独的数据泵的特定细节: .tcp:// SUBtransport-classestransport-classtransport-class
{ inproc:// | ipc:// | tipc:// | tcp:// | pgm:// | epgm:// | norm:// | vmci:// }


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

ZMQ_STREAM

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

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

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

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

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

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

您必须发送一个路由 ID 帧,然后发送一个数据帧。该ZMQ_SNDMORE标志是路由id帧所必需的,但在数据帧上被忽略。

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


推荐阅读