1. ホーム
  2. sockets

マルチキャスト(UDP)ソケットをバインドするとはどういう意味ですか?

2023-07-31 06:45:26

質問内容

私は、複数のネットワークインターフェイスを持つホスト間でマルチキャスト UDP を使用しています。 boost::asioを使用していますが、受信者が行わなければならない2つの操作(bindとjoin-group)に困惑しています。

参加するすべてのマルチキャストグループでそうしているのに、なぜバインド中にインターフェイスのローカルアドレスを指定する必要があるのでしょうか?

姉妹問題で、マルチキャストポートに関しても質問があります。送信時に、マルチキャストアドレスとポートに送信するので、なぜ、マルチキャスト グループへの加入時に、ポートではなく、アドレスだけを指定するのでしょうか - ポートは、バインドするための混乱した呼び出しで指定されます。

注意: "join-group"は setsockopt(IP_ADD_MEMBERSHIP) のラッパーで、ドキュメントにあるように、異なるグループ (異なるネットワーク上?) に加入するために同じソケット上で複数回呼び出される可能性があります。したがって、バインド呼び出しを省略して、グループにサブスクライブするたびにポートを指定することは完全に理にかなっています。

私が見たところ、常に "0.0.0.0" にバインドし、グループに参加するときにインターフェース アドレスを指定することは、非常によく機能します。混乱しました。

どのように解決するのですか?

マルチキャスト受信時にUDPソケットをバインドするとは、データを受信するアドレスとポートを指定することです(TCPアクセプタバインドのようなローカルインタフェースではありません)。このとき指定するアドレスは フィルタリング の役割を持ちます。つまり、ソケットはそのマルチキャストアドレスとポートに送られたデータグラムのみを受信し、その後にどのグループがソケットに参加したかは関係ありません。これは、INADDR_ANY (0.0.0.0) にバインドすると、私のマルチキャスト グループに送られたデータグラムを受信し、一方、ローカル インターフェイスのいずれかにバインドすると、データグラムがそのインターフェースが対応するネットワーク上で送信されているにもかかわらず、何も受信しない理由を説明します。

UNIX® ネットワーク プログラミング第 1 巻、第 3 版より引用。W.R Stevens 著「The Sockets Networking API」からの引用です。 21.10. 送信と受信

[...] 受信側ソケットにマルチキャストグループと ポート、例えば 239.255.1.2 ポート 8888 をバインドしてほしいのです。(単に をバインドすることもできますが、マルチキャストアドレスをバインドすると ポート8888を宛先とする他のデータグラムをソケットが受信できないようにします。 を受信できないようにします)。次に、受信側ソケットに をマルチキャストグループに参加させます。送信側ソケットは、このマルチキャストアドレスとポートにデータグラムを送信します。 この同じマルチキャストアドレスとポート、例えば239.255.1.2ポート8888にデータグラムを送信します。