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

cer*_*wen 6 python linux zeromq

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

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

在这种情况下,我一直在使用 Linux 的 iproute2ip addr add来创建地址和 ZeroMQPUB/SUB套接字原型。

use*_*197 8

好吧,ZeroMQ 读起来有点棘手socket- “交易对手” (不是)

为什么?

Classicalsocket是一种可免费使用的资源。

ZeroMQ 是一个相当复杂的行为(更好的分布式行为)的思想和原则的层次结构,它有助于设计智能分布式计算系统,而无需触及控制风暴中事件实际流的低级(ZeroMQ 很好抽象)细节在严酷的条件下,所有分布式计算系统都是开放的(并且必须相应地在低级别处理,如果要实现 ZeroMQ“承诺”保留的高级抽象并且让设计者的思想更容易专注于他的/她的核心应用程序部分,而不是重新设计轮子(包括所有的试验和错误)来拉动 O/S 资源的字符串和震动系统服务以收集一些低悬的果实)。


由于这些原因,最好直接忘记 ZeroMQ 是“类似-socket


不到五秒的 ZeroMQ 层次结构

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

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

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

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

4:
在本地“引擎” “内部”准备好“接入点”实例,可以将其物化锁定在外部现实中,使用一个或多个(是的,更多......哇!意味着更多的传入拉动-从单个接入点“行为节点”吹出的字符串/口哨声)调用以下任一方法: 或
.bind( <transport-class>://<a-class-specific-address> )

.connect( <transport-class>://<a-class-specific-address> )

5:
当且仅当一个.bind()-RTO-ready 接入点A“第一个实时.connect()-RTO-ready 接入点B访问” ,具有任何匹配的行为配对,ZeroMQ 消息/信令原型才会生效(将其命名为套接字可能是出于历史原因使用的,以方便解释)

PUB/PUB由于显而易见的原因,永远不会适合,而PUB/SUB许多其他行为原型对将会并且进行可爱的匹配并形成相互“兼容”的行为,这些行为最终将继续存在并保持下去)


那么,给定一台具有多个地址的机器,
我如何使用 Python ZeroMQ 套接字做同样的事情

只需在对方法的调用中使用完全限定的规范即可完成。
.bind( "{ tcp | pgm | epgm }://<ip>:<port#>" )

这么容易。

很酷,不是吗?

在性能调整、延迟调整和安全调整的引擎盖下还有许多令人惊喜的惊喜。

  • 很高兴你发现它很有帮助。`.connect()` 与 `.bind()` 方法的工作方式相同。重要而酷的是,一个 [**Access Point**] 可以`.connect( "tcp://&lt;address&gt;:&lt;port&gt;" )` 和 `.connect( "vmci://@: &lt;port&gt;" )` 和 `.connect( "ipc://&lt;address_identifier&gt;" )` 并在相同的 [**Access Point**] 正式通信行为模型下操作所有这些已建立的连接。**这就是详细阐述上面所有细节的原因**,开始意识到ZeroMQ-sockets有多么不同,以及它们为高级分布式系统带来的巨大力量。 (3认同)

cer*_*wen 1

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

rc = zmq_connect(socket, "tcp://192.168.1.17:5555;192.168.1.1:5555")
Run Code Online (Sandbox Code Playgroud)

在 Python 中,这看起来像:

socket = zmq.Context().socket(zmq.SUB)
socket.connect('tcp://192.168.1.17:5555;192.168.1.1:5555')
Run Code Online (Sandbox Code Playgroud)

  • 以分号分隔的列表扩展实际上是 ZeroMQ 核心的“隐藏”API 功能的副作用。它在功能上创建了与调用 `.connect()` 方法的序列相同的东西,无论第一个是否使用 `tcp://` *transport-class* 而另一个是 `epgm://`一,如上所述。 (3认同)