特定のポートにバインドせずにソケットをセットアップするdgram.createSocket('udp4');
と、255.255.255.255 に送信されたブロードキャスト パケットを受信しますが、同じソケットをインターフェイスの特定の IP にバインドすると、this.server.bind(67, host);
これらのブロードキャスト パケットは受信されません。これは正常な動作ですか?
2 に答える
java.net.DatagramSocketのJavadocは次のように述べています。
ブロードキャストパケットを受信するには、DatagramSocketをワイルドカードアドレスにバインドする必要があります。一部の実装では、DatagramSocketがより具体的なアドレスにバインドされている場合にも、ブロードキャストパケットを受信することがあります。
これは、動作がプラットフォームに依存していることをかなり明確に示しているため、Javascriptソケットも同じように影響を受けます。
私のテストによると、Windows Vista 64は2番目の文で説明されているように動作しません(つまり、INADDR_ANYにバインドされていない限りブロードキャストを受信しません)。
はい、これは予想される動作です。ポートまたはインターフェイスがないと、dgram.createSocket() は次のようになるためです。
ランダムなポートの「すべてのインターフェース」アドレスにバインドします (udp4 ソケットと udp6 ソケットの両方に対して正しいことを行います)。
-- nodejs.org のdgram API ドキュメントから
これにより、使用可能な任意のインターフェイスの任意のポートへのブロードキャスト パケットをキャプチャできます。
インターフェイスとポートの両方を createSocket() に証明すると、指定されたポートの指定されたインターフェイスにバインドされたネットワークにブロードキャストされたパケットのみをキャプチャするように制限されます。
特定のインターフェイスへのブロードキャストを受信するには、そのインターフェイスがサービスを提供するネットワーク上またはネットワークのブロードキャスト アドレスに送信する必要があることに注意してください。
したがって、ネットワークが次の場合:
10.1.1.0
次のネットマスクを使用:
255.255.255.252
また、次のとおりです。
10.1.1.0/29 (CIDR notation)
正しいブロードキャスト アドレスは次のとおりです。
10.1.1.7
ネットワーク アドレスとネットマスクがあれば、tuxgraphics.org の「ネットワークと IP アドレスの計算ツール」を使用して、特定のネットワークの正しいブロードキャスト アドレスを特定できます。