2017-09-06 23 views
2

Pythonでは、マルチキャストトラフィックをリッスンするスクリプトを作成するときに、ソケットのIP_ADD_MEMBERSHIPオプションを、マルチキャストグループアドレスとローカルインターフェイスのアドレスからなる値で設定しますグループのトラフィックを待ち受けます。インターネット上のPythonソケットIP_ADD_MEMBERSHIPとINADDR_ANYの混乱

多くの例は、ローカルインタフェースとしてIP_ADD_MEMBERSHIPINADDR_ANYワイルドカードアドレスを渡し、そしては、それらのいくつかが、これはソケットがマルチキャストパケットのすべてインタフェースで待機するようになりますと述べています。しかし、LinuxのIPは(7)のmanページをINADDR_ANY

を使用した場合

とFreeBSDのmanページ「適切なインターフェースがシステムによって選択されている」と述べているが、それは、「デフォルトのインターフェースを選択することを言います"

オンラインの回答が間違っているか、ここで紛失しているものがあります。私はINADDR_ANYIP_ADD_MEMBERSHIPのパラメータとして使用すると混乱していると考えています。bind()(空の文字列で表されます)のパラメータとして使用された場合はINADDR_ANYですが、わかりません。 (デフォルトのインターフェイスまたはすべてのインターフェイスを選択)で使用された場合、INADDR_ANYまたは0.0.0.0で何が起こっているのかを明確にして、bindと一緒に使用すると、

答えて

2

bindコールでアドレスとしてINADDR_ANYが指定されている場合、ソケットはの任意のポートでlistenするようになります。ネットワークインターフェイス。

このようにbindを呼び出した後、あなたはnetstatコマンドの出力には、このようなエントリが表示されます:

udp  0  0 0.0.0.0:46162   0.0.0.0:* 

これは、ポートでINADDR_ANYにバインドされたUDPソケットである46162.

IP_ADD_MEMBERSHIPオプションを設定するときにインターフェイスアドレスとして使用される場合、INADDR_ANYは、OSが特定のマルチキャストグループに参加するインターフェイス、つまり「デフォルト」ネットワークインターフェイスを選択することを示します。

ではないは、すべてのインターフェイスでグループに参加することを意味します。これを行うには、すべてのネットワークインターフェイス上でitereateし、それぞれにIP_ADD_MEMBERSHIPオプションを設定する必要があります。

私はLinux、Solaris、FreeBSD、およびWindowsで作業しましたが、INADDR_ANYを使用している場合は、すべてのインターフェイスでマルチキャストグループに参加していません。

+0

ありがとうございます、これは私のものをクリアします – AndroidX