5

いくつかのデータの UDP ブロードキャストがあります。OSX 10.6.8の下で、Python 2.6.1で次のクライアントを開くことができ、動作します。データをキャッチできます。すべて問題ありません。

しかし、このコードはポートを「消費」します。つまり、別のポートを開くことができず、バインドの 2 回目の試行が失敗します...そして、複数のリスナーを許可する必要があります。ポートを開くコードは次のとおりです。

import select, socket
port = 58083        # port msg is broadcast upon

# Create listening port
# ---------------------
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
    s.bind(('', port))
except:
     print 'failure to bind'
    s.close()
    raise
s.setblocking(0)

...UDP は(とりわけ) 複数のクライアントへのブロードキャストを目的としているため、何か間違ったことをしていると思います。私はちょうど何を理解することはできません。

提案したアクティブステートの例を見つけました:

s.bind(('<broadcast>',port))

...しかし、それは毎回失敗します。バインドは0.0.0.0機能しますが、「クライアントが 1 つ」という問題もあります。ローカル IP (例: ) へのバインド192.168.1.100がまったく機能しません。バインドの削除はまったく機能しません。

誰?

4

1 に答える 1

3

58083 でリッスンするために複数のプロセスが必要な場合は、事前にSO_REUSEADDRソケットを設定する必要があります。socket.bind()

import select, socket
port = 58083        # port msg is broadcast upon

# Create listening port
# ---------------------
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # Allow other processes to
                                                         #    bind to port
try:
    s.bind(('0.0.0.0', port))
except:
     print 'failure to bind'
    s.close()
    raise
s.setblocking(0)

下部に無限ループを追加し、これを Linux サーバーで 2 回実行した後 (1 回は root として、もう 1 回は unpriv ユーザーとして)、次のように表示されます。

root@tsunami# lsof | grep 58083
python    25908       root    3u     IPv4             284835      0t0        UDP *:58083
python    25945   mpenning    3u     IPv4             284850      0t0        UDP *:58083
root@tsunami#
于 2012-06-17T21:59:07.740 に答える