gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:42 38 4
gpt4 key购买 nike

我有一台在环回接口(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/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com