Win32 API 日本語リファレンス
ホームNetworking.WinSock › IP_MREQ

IP_MREQ

構造体
サイズx64: 16 バイト / x86: 8 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
imr_multiaddrIN_ADDR8/4+0+0IPv4 マルチキャストグループのアドレスです。
imr_interfaceIN_ADDR8/4+8+4

マルチキャストグループへの参加または脱退を行うインターフェイスのローカル IPv4 アドレス、またはインターフェイスインデックスです。この値はネットワークバイトオーダーです。このメンバーに IPv4 アドレス 0.0.0.0 を指定した場合は、既定の IPv4 マルチキャストインターフェイスが使用されます。

インターフェイスインデックスに 1 を使用することは、IP アドレス 0.0.0.1 を指定することと同じです。

公式ドキュメント

ip_mreq 構造体は、IPv4 アドレス向けのマルチキャストグループ情報を提供します。

解説(Remarks)

ip_mreq 構造体は IPv4 アドレスで使用されます。ip_mreq 構造体は、IP_ADD_MEMBERSHIP および IP_DROP_MEMBERSHIP ソケットオプションと共に使用されます。

IPv4 マルチキャストプログラミングで使用される ip_mreq 構造体および関連する構造体は、RFC 3768 のセクション 4 と 8.1 に示された IETF の推奨に基づいています。詳細については、http://www.ietf.org/rfc/rfc3678.txt を参照してください。

IPv4 でより細かく構成可能なマルチキャスト機能を利用するには、ip_mreq_source 構造体を使用します。詳細については、Multicast Programming を参照してください。

Windows Vista 以降では、IPv6 アドレスと IPv4 アドレスの両方をサポートする一連のマルチキャストプログラミング用ソケットオプションが利用できます。これらのソケットオプションは IP のバージョンに依存せず、IPv6 と IPv4 のどちらでも使用できます。これらの IP 非依存のオプションは GROUP_REQ 構造体と GROUP_SOURCE_REQ 構造体を使用し、Windows Vista 以降でのマルチキャストプログラミングでは、これらのソケットオプションの使用が推奨されます。

ip_mreq 構造体は、IPv6 用の ipv6_mreq 構造体に相当する IPv4 用の構造体です。

imr_interface メンバーにはインターフェイスインデックスを指定できます。0.x.x.x のブロック (最初のオクテットが 0) に含まれる IP アドレスは、0.0.0.0 を除いてすべてインターフェイスインデックスとして扱われます。 インターフェイスインデックスは 24 ビットの数値です。0.0.0.0/8 の IPv4 アドレスブロックは使用されません (この範囲は予約済みです)。imr_interface メンバーに指定するインターフェイスインデックスの情報は、GetAdaptersAddresses 関数を使用して取得できます。

ip_mreq 構造体の imr_interface メンバーには、既定のインターフェイスを使用するのではなく、常にローカルの IPv4 アドレスまたはインターフェイスインデックスを指定することをお勧めします。これは、複数のネットワークインターフェイスと複数のパブリック IPv4 アドレスを持つコンピューターでは特に重要です。

IPv4 マルチキャストで使用される既定のインターフェイスは、Windows のネットワークスタックによって決定されます。アプリケーションは、GetIpForwardTable 関数で IPv4 ルーティングテーブルを取得することにより、IPv4 マルチキャストに使用される既定のインターフェイスを判別できます。宛先 IP アドレス 224.0.0.0 に対するルーティングメトリックの値が最も小さいネットワークインターフェイスが、IPv4 マルチキャストの既定のインターフェイスです。ルーティングテーブルは、コマンドプロンプトから次のコマンドで表示することもできます。

route print

IP_MULTICAST_IF ソケットオプションを使用すると、IPv4 マルチキャストパケットの送信に使用する既定のインターフェイスを設定できます。このソケットオプションは、IPv4 マルチキャストパケットの受信に使用される既定のインターフェイスを変更するものではありません。

一般的な IPv4 マルチキャストアプリケーションでは、IP_ADD_MEMBERSHIP ソケットオプションと ip_mreq 構造体を使用してマルチキャストグループに参加し、特定のインターフェイス上でマルチキャストパケットを待ち受けます。マルチキャストグループへ IPv4 マルチキャストパケットを送信するインターフェイスの設定には、IP_MULTICAST_IF ソケットオプションを使用します。最も一般的なのは、マルチキャストグループに対して同じインターフェイスで受信と送信を行うマルチキャストアプリケーションです。マルチキャストアプリケーションでは、受信用に 1 つのソケット、送信用に 1 つ以上のソケットというように、複数のソケットを使用する場合もあります。

Windows Vista 以降向けにリリースされた Microsoft Windows Software Development Kit (SDK) では、ヘッダーファイルの構成が変更され、ip_mreq 構造体は Ws2ipdef.h ヘッダーファイルで定義されています。このヘッダーファイルは Ws2tcpip.h ヘッダーファイルから自動的にインクルードされます。Ws2ipdef.h ヘッダーファイルを直接使用しないでください。

Note IP_MREQ および PIP_MREQ の派生構造体は、Windows Vista 以降と共にリリースされた Windows SDK でのみ定義されています。それ以前のバージョンの Windows SDK では、ip_mreq 構造体を使用してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// IN_ADDR  (x64 8 / x86 4 バイト)
typedef struct IN_ADDR {
    _S_un_e__Union S_un;
} IN_ADDR;

// IP_MREQ  (x64 16 / x86 8 バイト)
typedef struct IP_MREQ {
    IN_ADDR imr_multiaddr;
    IN_ADDR imr_interface;
} IP_MREQ;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IN_ADDR
{
    public _S_un_e__Union S_un;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_MREQ
{
    public IN_ADDR imr_multiaddr;
    public IN_ADDR imr_interface;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IN_ADDR
    Public S_un As _S_un_e__Union
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IP_MREQ
    Public imr_multiaddr As IN_ADDR
    Public imr_interface As IN_ADDR
End Structure
import ctypes
from ctypes import wintypes

class IN_ADDR(ctypes.Structure):
    _fields_ = [
        ("S_un", _S_un_e__Union),
    ]

class IP_MREQ(ctypes.Structure):
    _fields_ = [
        ("imr_multiaddr", IN_ADDR),
        ("imr_interface", IN_ADDR),
    ]
#[repr(C)]
pub struct IN_ADDR {
    pub S_un: _S_un_e__Union,
}

#[repr(C)]
pub struct IP_MREQ {
    pub imr_multiaddr: IN_ADDR,
    pub imr_interface: IN_ADDR,
}
import "golang.org/x/sys/windows"

type IN_ADDR struct {
	S_un _S_un_e__Union
}

type IP_MREQ struct {
	imr_multiaddr IN_ADDR
	imr_interface IN_ADDR
}
type
  IN_ADDR = record
    S_un: _S_un_e__Union;
  end;

  IP_MREQ = record
    imr_multiaddr: IN_ADDR;
    imr_interface: IN_ADDR;
  end;
const IN_ADDR = extern struct {
    S_un: _S_un_e__Union,
};

const IP_MREQ = extern struct {
    imr_multiaddr: IN_ADDR,
    imr_interface: IN_ADDR,
};
type
  IN_ADDR {.bycopy.} = object
    S_un: _S_un_e__Union

  IP_MREQ {.bycopy.} = object
    imr_multiaddr: IN_ADDR
    imr_interface: IN_ADDR
struct IN_ADDR
{
    _S_un_e__Union S_un;
}

struct IP_MREQ
{
    IN_ADDR imr_multiaddr;
    IN_ADDR imr_interface;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IP_MREQ サイズ: 8 バイト(x86)
dim st, 2    ; 4byte整数×2(構造体サイズ 8 / 4 切り上げ)
; imr_multiaddr : IN_ADDR (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; imr_interface : IN_ADDR (+4, 4byte)  varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_MREQ サイズ: 16 バイト(x64)
dim st, 4    ; 4byte整数×4(構造体サイズ 16 / 4 切り上げ)
; imr_multiaddr : IN_ADDR (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; imr_interface : IN_ADDR (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global IN_ADDR
    #field byte S_un 8
#endstruct

#defstruct global IP_MREQ
    #field IN_ADDR imr_multiaddr
    #field IN_ADDR imr_interface
#endstruct

stdim st, IP_MREQ        ; NSTRUCT 変数を確保