2012-03-11 68 views
3

我使用zmq绑定python,我想绑定客户端到某个端口,然后将该位置发送到其他客户端进行连接。 现在,这是基本的绑定代码:0mq如何获得绑定地址

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,它可能是无效的,因为我不知道zmq使用了什么网卡。

回答

1

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