python – ZeroMQ如何在pyzmq中获取绑定地址

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

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用于创建套接字的外部IP接口?

在PC上可以有多少个NIC,如果我只是尝试使用普通套接字获取外部IP,它可能无效,因为我不知道NIC ZMQ使用了什么.

最佳答案
0.0.0.0(INADDR_ANY)是“任意”地址(不可路由的元地址).这是一种指定“任何IPv4接口”的方法.
这意味着您的所有接口都在侦听端口12345.

要列出所有网络接口,我建议使用像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中获取绑定地址 - 代码日志