gpt4 book ai didi

python - ZeroMQ如何在pyzmq中获取绑定(bind)地址

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:07 27 4
gpt4 key购买 nike

我在 Python 中使用 ZMQ 绑定(bind),我想将客户端绑定(bind)到某个端口,然后将该位置发送给其他客户端进行连接。现在这是基本的绑定(bind)代码:

subscriber = context.socket(zmq.SUB)
...
subscriber.bind("tcp://0.0.0.0:12345")

我需要得到的是外部地址,不是0.0.0.0,假设我的电脑有IP 192.168.1.10,我需要得到“tcp://192.168.1.10:12345"并将其发送给其他客户端,因为发送 tcp://0.0.0.0:12345 是没有用的。

如何获取 ZMQ 用于创建套接字的接口(interface)的外部 IP?

pc 上可能有网卡的数量,如果我只是尝试使用普通套接字获取外部 IP,它可能无效,因为我不知道 ZMQ 使用的是什么网卡。

最佳答案

0.0.0.0 (INADDR_ANY) 是“任何”地址(不可路由的元地址)。这是一种指定“任何 IPv4 接口(interface)”的方法。这意味着您的所有接口(interface)都在端口 12345 上监听。

要列出所有网络接口(interface),我建议使用类似 this 的库

如果你使用的是 linux,你可以这样做:

import array
import struct
import socket
import fcntl

SIOCGIFCONF = 0x8912 #define SIOCGIFCONF
BYTES = 4096 # Simply define the byte size

# get_iface_list function definition
# this function will return array of all 'up' interfaces
def get_iface_list():
# create the socket object to get the interface list
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# prepare the struct variable
names = array.array('B', '\0' * BYTES)

# the trick is to get the list from ioctl
bytelen = struct.unpack('iL', fcntl.ioctl(sck.fileno(), SIOCGIFCONF, struct.pack('iL', BYTES, names.buffer_info()[0])))[0]

# convert it to string
namestr = names.tostring()

# return the interfaces as array
return [namestr[i:i+32].split('\0', 1)[0] for i in range(0, bytelen, 32)]

# now, use the function to get the 'up' interfaces array
ifaces = get_iface_list()

# well, what to do? print it out maybe...
for iface in ifaces:
print iface

关于python - ZeroMQ如何在pyzmq中获取绑定(bind)地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660106/

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