4

Python で ZMQ バインディングを使用しています。クライアントをポートにバインドし、その場所を他のクライアントに送信して接続したいと考えています。これは基本的なバインディング コードです。

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

私が取得する必要があるのは外部アドレスであり0.0.0.0、私のPCにIPがあるとしましょう。送信は役に立たない 192.168.1.10ため、「tcp://192.168.1.10:12345」を取得して他のクライアントに送信する必要があります。tcp://0.0.0.0:12345

ZMQ がソケットの作成に使用したインターフェイスの外部 IP を取得するにはどうすればよいですか?

PCにはNICの数が存在する可能性があり、通常のソケットを使用して外部IPを取得しようとすると、ZMQが使用したNICがわからないため、無効になる可能性があります。

4

2 に答える 2

1

0.0.0.0 (INADDR_ANY) は「任意の」アドレス (ルーティング不可能なメタアドレス) です。これは、「すべての IPv4 インターフェース」を指定する方法です。これは、すべてのインターフェイスがポート 12345 でリッスンしていることを意味します。

すべてのネットワーク インターフェイスを一覧表示するには、このようなライブラリを使用することをお勧めします

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
于 2012-05-16T18:57:22.587 に答える