python - 如何使用特定源 IP 将 ZeroMQ 连接到 .connect() 到本地主机?

标签 python linux zeromq

我有一台在环回接口(interface)上配置了额外 IP 的 Linux 机器:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 100.100.100.100/24 scope global lo
       valid_lft forever preferred_lft forever
    inet 100.100.100.101/24 scope global secondary lo
       valid_lft forever preferred_lft forever
    ...

我正在使用 ZeroMQ 的 PUB/SUB 模式使用这些源 ips 连接到远程。

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

相应的服务器监听所有接口(interface)。

socket = zmq.Context().socket(zmq.PUB)
socket.bind('tcp://*:5555')

如果网络配置正确,使用这些地址发送对远程主机有效,所以我知道这是有效的。 (这很复杂。)现在我想对这个设置进行单元测试,这意味着检查设置源 ip 是否工作而不需要服务器的远程主机。我以相同的配置运行服务器,然后尝试使用类似的方式进行连接:

socket = zmq.Context().socket(zmq.SUB)
socket.connect('tcp://100.100.100.100:5555;localhost:5555')

客户端永远不会与服务器建立连接,但如果我删除源端点,它就会工作。 localhost 和 127.0.0.1 都不能用作 .connect() 调用中的目标地址。但是,如果我使用相同的源 IP 调用 netcat

nc -s 100.100.100.100 -v -z -w 5 localhost 5555

这成功了,我连接的服务器正确接收到来自 100.100.100.100 的连接。我查看了 tshark 的输出,在 ZeroMQ 客户端的情况下,我没有看到来自 100.100.100.100 的任何流量通过环回接口(interface),而当我使用 nc 建立到 ZeroMQ 服务器的 TCP 连接时,我愿意。

这是怎么回事? ZeroMQ 是否为这种发夹连接做了一些特殊的事情,如果是,有没有办法禁用它?有没有好的方法来测试我是否在不使用远程主机的情况下正确调用 ZeroMQ 的源 IP 功能?

这可能被视为我的 previous question 的后续行动.

最佳答案

您不能在同一接口(interface)的同一端口上发送和接收。
最好的解决方案是允许 ZeroMQ 选择要发送的端口:

套接字 = zmq.Context().socket(zmq.SUB) socket.connect('tcp://100.100.100.100:*;192.168.1.1:5555')

不幸的是,ZeroMQ 的 4.2.2 版本不支持这一点,但即将发布的版本应该支持。目前,唯一的解决方案是为发送地址和接收地址硬编码不同的端口:

套接字 = zmq.Context().socket(zmq.SUB) socket.connect('tcp://100.100.100.100:6666;192.168.1.1:5555')

关于python - 如何使用特定源 IP 将 ZeroMQ 连接到 .connect() 到本地主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045086/

相关文章:

python - 生成每列的出现次数,但相对于另一列?

linux - 比较和显示哈希值

linux - 如何将bash变量传递给cmd?

tcp - 多人游戏开发中的 ZeroMQ

python - 如何在 tensorflow 中保存文本分类模型?

python - 如何在 Docker、Ubuntu 中运行我的脚本 python openCV

mysql - 错误 : 'Can' t connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)' -- Missing/var/run/mysqld/mysqld. socks

c - Zeromq:使用 zmq 的 PUB/SUB 程序,不交换消息

c - c中zmq客户端内存泄漏

Python 模块变得太大