ZeroMQ как получить привязанный адрес в pyzmq - PullRequest
4 голосов
/ 12 марта 2012

Я использую привязки ZMQ в Python и хочу привязать клиентов к какому-либо порту, а затем отправить это местоположение другим клиентам для подключения. Теперь это основной обязательный код:

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 бесполезна.

Как я могу получить внешний IP интерфейса, который ZMQ использовал для создания сокета?

Может быть количество сетевых карт на ПК, и если я просто попытаюсь получить внешний IP-адрес с помощью обычного сокета, он может быть недействительным, потому что я не знаю, какой сетевой адаптер используется ZMQ.

Ответы [ 2 ]

1 голос
/ 16 мая 2012

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
0 голосов
/ 25 ноября 2018

Чтобы получить IP-адрес вашей машины, это может помочь:

def get_ip_data(ether_adapter):
    ip_data = os.popen("ifconfig " + ether_adapter)
    for line in ip_data:
        match2 = re.search(r'inet addr:+(\d+.\d+.\d+.\d+)', line)
        if match2:
            ip_ = match2.group(1)
            return ip_
if __name__=="__main__":
    ethernet_card = "wlp3s0"   ---> This might be etho or whatever you want
    ip_of_the_machine = get_ip_data(ethernet_card)
...