6

ホストマシンによって生成されたUDPブロードキャストパケットをリッスンするUbuntu仮想マシンがあります。Pythonのsocket.bindメソッドを使用してネットワークインターフェイスeth1またはlo(ローカルループバック)のいずれかにバインドすると、パケットを受信しません。ただし、''(すべてのインターフェイスのシンボル)を使用してバインドする場合は、すべて問題ありません。eth1のアドレスだけにバインドできると思いますが、そうではないようです。誰かが''が必要な理由を説明できますか?仮想マシンを使用しているため、何かファンキーなことが起こっていますか?ブリッジネットワーク設定を使用しているため、仮想マシンはLAN上の別のマシンのように見えます。コードは次のとおりです。

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 

# using the '' address works
sock.bind(('', UDP_PORT))
# using the address of eth1 doesn't
#sock.bind(('192.168.2.123', UDP_PORT))
# and neither does using the local loopback
#sock.bind(('127.0.0.1', UDP_PORT))

while True:
    data, addr = sock.recv(2048)
    print data
4

2 に答える 2

0

ブロードキャストアドレスにバインドするオプション「<broadcast>」もあります(http://docs.python.org/2/library/socket.htmlによる)。したがって、192.168.2.255などのインターフェイスのブロードキャストアドレスを使用することをお勧めします(ネットワークが192.168.2.0/24であると想定)。

于 2013-04-23T15:16:38.657 に答える
0

ネットワークプログラミングでは、空のアドレス文字列は構成されたすべてのインターフェイスを示します。ただし、IPアドレスが指定されている場合、ソケットは指定されたIPアドレスのインターフェイスでのみリッスンします。

于 2015-01-30T14:33:52.750 に答える