ホストは、IP マルチキャストデータグラムを受信する前に、1 つ以上の IP マルチキャストグループのメンバーになる必要があります。プロセスは、次のソケットオプションを使用して、マルチキャストグループに加わるようにホストに求めることができます。
struct ipv6_mreq mreq; setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq))mreq は次の構造体です。
struct ipv6_mreq { struct in6_addr ipv6mr_multiaddr; /* IPv6 マルチキャストアドレス */ unsigned int ipv6mr_interface; /* インタフェースインデックス */ }各メンバーシップは単一のインタフェースに関連付けられ、複数のインタフェース上の同じグループに加わることができます。ipv6_interface が 0 になるように指定してデフォルトのマルチキャストインタフェースを選択するか、あるいはホストのインタフェースの 1 つのインタフェースインデックスを指定してその (マルチキャスト機能を持った) インタフェースを選択してください。
struct ipv6_mreq mreq; setsockopt(sock, IPPROTO_IPV6, IP_LEAVE_GROUP, &mreq, sizeof(mreq))mreq には、メンバーシップの追加に使用した同じ値が入ります。ソケットが閉じられるか、あるいはソケットを保持しているプロセスが停止する時には、ソケットに関連付けられたメンバーシップも取り消されます。特定のグループ内で複数のソケットがメンバーシップを要求でき、ホストは最後の要求が取り消されるまでそのグループのメンバーにとどまります。
ソケットのどれかがデータグラムの宛先グループ内でメンバーシップを要求した場合、カーネル IP 層が受信マルチキャストパケットを受け入れます。特定のソケットに対するマルチキャストデータグラムの配信は、単一キャストデータグラムの場合と同様に、宛先ポートと、ソケットに関連付けられたメンバーシップ (raw ソケットの場合はプロトコルタイプ) に基づいています。特定のポートに送信されたマルチキャストデータグラムを受信するには、ローカルアドレスを未指定のまま (INADDR_ANY などに指定) ローカルポートにバインドします。
次の指定が bind(3SOCKET) の前にあると、複数のプロセスを同じ SOCK_DGRAM UDP ポートにバインドできます。
int one = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))この場合、共有ポートに向けられた各受信マルチキャスト UDP データグラムは、そのポートにバインドされているすべてのソケットに配信されます。下位互換性の理由から、これは単一キャストの受信データグラムには適用されません。データグラムの宛先ポートにバインドされているソケットの数にかかわらず、単一キャストデータグラムが複数のソケットに配信されることはありません。SOCK_RAW ソケットは、SO_REUSEADDR オプションがなくても単一の IP プロトコルタイプを共有できます。
マルチキャストに関連する新しいソケットオプションの説明は、<netinet/in.h> を参照してください。IP アドレスはすべて、ネットワークバイトオーダーで渡されます。