如何控制具有多个IP的机器上的ZeroMQ数据包的源IP地址?

Python标准库的socket .create_connection()方法具有源地址选项,用于控制连接使用的源IP。

给定一个具有多个地址的机器,如何用Python ZeroMQ套接字完成同样的工作?

在这种情况下,我一直在使用Linux的iproute2 ip addr add来创build地址和ZeroMQ PUB/SUB socket-archetypes。

那么,ZeroMQ作为一个socket读取有点棘手 – “对手” (不是)

为什么?

古典socket是一个免费的线束资源。

ZeroMQ是一个相当复杂的行为思想和原则(更好的分布式行为)的层次结构,帮助设计智能分布式计算系统,而不涉及控制风暴中事件的实际流程的低级别(ZeroMQ抽象)细节。在苛刻的条件下,所有的分布式计算系统都是开放的(如果ZeroMQ承诺保留的高级抽象要被实现,并且要让设计者的注意力集中在他/她的核心应用程序部分,而不是重新设计车轮(包括所有的试验和错误)在操作系统资源上的拉线和摇动系统服务,以收集一些低悬的水果类型)。


由于这些原因, 直接忘记了ZeroMQ是“像东西一样的 socket


ZeroMQ层次结构不到五秒

1:
ZeroMQ承诺可以轻松地重复使用一些简单的可扩展正式通信模式原型,提供特定的分布式行为{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP } { PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP } { PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }

2:
除了仅使用无设备的 inproc:// transport-class的情况外,在所有其他情况下,ZeroMQ需要一个或多个可调“ 引擎 ”的实例 – 一个Context( nIOthreads = N )N >= 1

3:
有了这个,任何(未来的套接字接入点都可以被实例化,从出生的那一刻起就具有行为原型:

 aSubscribeCHANNEL = aLocalCONTEXT.socket( zmq.SUB ) # this is NOT a <SOCKET> # ^^^^^^__________________ even it was typed in 

4:
有一个“ 接入点 ”的实例准备“内部”的本地“ 引擎 ”,可以锁定在外部现实的物化,使用一个或多个(是的,更多…哇! /吹口哨从一个单一的访问点“行为节点”)调用任何一种方法:
.bind( <transport-class>://<a-class-specific-address> )
要么
.connect( <transport-class>://<a-class-specific-address> )

5:
当且仅当第一个live .connect .connect() RTO就绪的接入点B(具有任何匹配的行为配对.bind() RTO就绪的接入点A“ 被访问 ”时,ZeroMQ消息/信令原型获取生活(命名它也是一个套接字可能是由于历史的原因,以缓解时代的解释)

PUB/PUB永远不会适合,因为显而易见的原因,而PUB/SUB和许多其他行为 – 原型对将会和可爱地匹配,并形成相互“兼容”的行为,最终将会继续存在并保持这种状态)


所以,
我如何用Python ZeroMQ套接字来做同样的事情,
给定一个有多个地址的机器?

只需在呼叫中使用完全合格的规格即可
.bind( "{ tcp | pgm | epgm }://<ip>:<port#>" )方法,就完成了。

那很简单。

很酷,不是吗?

在性能调整,延迟削减和安全性调整等方面,还有许多令人惊喜的惊喜。

当试图将.connect()发送到远程时,我在协议文档中找到了答案,将源ip放在连接字符串的分号前:

 rc = zmq_connect( socket, "tcp://192.168.1.17:5555;192.168.1.1:5555" ) 

在Python中,这看起来像:

 socket = zmq.Context().socket( zmq.SUB ) socket.connect( 'tcp://192.168.1.17:5555;192.168.1.1:5555' )