IPV6_MREQ
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ipv6mr_multiaddr | IN6_ADDR | 16 | +0 | +0 | IPv6 マルチキャストグループのアドレスです。 |
| ipv6mr_interface | DWORD | 4 | +16 | +16 | マルチキャストグループへの参加または脱退を行うローカルインターフェイスのインターフェイスインデックスです。このメンバーにインターフェイスインデックスとして 0 を指定した場合は、既定のマルチキャストインターフェイスが使用されます。 |
公式ドキュメント
ipv6_mreq 構造体は、IPv6 アドレス用のマルチキャストグループ情報を提供します。
解説(Remarks)
ipv6_mreq 構造体は IPv6 アドレスで使用されます。ipv6_mreq 構造体は、IPV6_ADD_MEMBERSHIP、IPV6_DROP_MEMBERSHIP、IPV6_JOIN_GROUP、IPV6_LEAVE_GROUP の各ソケットオプションと共に使用されます。IPV6_JOIN_GROUP と IPV6_ADD_MEMBERSHIP のソケットオプションは同一のものとして定義されています。IPV6_LEAVE_GROUP と IPV6_DROP_MEMBERSHIP のソケットオプションは同一のものとして定義されています。
Windows Vista 以降では、IPv6 アドレスと IPv4 アドレスの両方をサポートする一連のソケットオプションがマルチキャストプログラミング向けに用意されています。これらのソケットオプションは IP に依存せず、IPv6 と IPv4 の両方で使用できます。これらの IP 非依存のオプションは GROUP_REQ 構造体および GROUP_SOURCE_REQ 構造体を使用するもので、Windows Vista 以降のマルチキャストプログラミングでは推奨されるソケットオプションです。
ipv6_mreq 構造体は、IPv4 ベースの ip_mreq 構造体に相当する IPv6 版です。
ipv6mr_interface メンバーに必要なインターフェイスインデックスの情報は、GetAdaptersAddresses 関数を使用して取得できます。
ipv6_mreq 構造体、およびこの構造体を使用する IPPROTO_IPV6 レベルのソケットオプションは、データグラムソケットと raw ソケットでのみ有効です (ソケットの種類は SOCK_DGRAM または SOCK_RAW でなければなりません)。
既定のインターフェイスを使用するのではなく、ipv6_mreq 構造体の ipv6mr_interface メンバーには常にローカルの IPv6 インターフェイスインデックスを指定することをお勧めします。これは、複数のネットワークインターフェイスと複数のパブリック IPv6 アドレスを持つコンピューターでは特に重要です。
IPv6 マルチキャストで使用される既定のインターフェイスは、Windows のネットワークスタックによって決定されます。Windows Vista 以降では、アプリケーションは GetIpForwardTable2 関数で IPv6 ルーティングテーブルを取得することにより、IPv6 マルチキャストで使用される既定のインターフェイスを判別できます。宛先 IPv6 マルチキャストアドレス (FF00::/8 の IPv6 アドレスブロック) に対するルーティングメトリックの値が最も小さいネットワークインターフェイスが、IPv6 マルチキャストの既定のインターフェイスとなります。ルーティングテーブルは、コマンドプロンプトから次のコマンドで表示することもできます。
route print
IPV6_MULTICAST_IF ソケットオプションを使用すると、IPv6 マルチキャストパケットを送信する既定のインターフェイスを設定できます。このソケットオプションは、IPv6 マルチキャストパケットの受信に使用される既定のインターフェイスを変更しません。
一般的な IPv6 マルチキャストアプリケーションでは、IPV6_ADD_MEMBERSHIP または IPV6_JOIN_GROUP ソケットオプションを ipv6_mreq 構造体と共に使用してマルチキャストグループに参加し、特定のインターフェイスでマルチキャストパケットを待ち受けます。IPV6_MULTICAST_IF ソケットオプションは、マルチキャストグループへ IPv6 マルチキャストパケットを送信するインターフェイスの設定に使用します。最も一般的なシナリオは、マルチキャストグループに対して同じインターフェイスで受信と送信を行うマルチキャストアプリケーションです。マルチキャストアプリケーションによっては、受信用に 1 つ、送信用に 1 つ以上というように複数のソケットを使用する場合もあります。
Windows Vista 以降向けにリリースされた Microsoft Windows Software Development Kit (SDK) では、ヘッダーファイルの構成が変更されており、ipv6_mreq 構造体は Ws2ipdef.h ヘッダーファイルで定義されています。このヘッダーファイルは Ws2tcpip.h ヘッダーファイルによって自動的にインクルードされます。Ws2ipdef.h ヘッダーファイルを直接使用しないでください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// IN6_ADDR (x64 16 / x86 16 バイト)
typedef struct IN6_ADDR {
_u_e__Union u;
} IN6_ADDR;
// IPV6_MREQ (x64 20 / x86 20 バイト)
typedef struct IPV6_MREQ {
IN6_ADDR ipv6mr_multiaddr;
DWORD ipv6mr_interface;
} IPV6_MREQ;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IN6_ADDR
{
public _u_e__Union u;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPV6_MREQ
{
public IN6_ADDR ipv6mr_multiaddr;
public uint ipv6mr_interface;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IN6_ADDR
Public u As _u_e__Union
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPV6_MREQ
Public ipv6mr_multiaddr As IN6_ADDR
Public ipv6mr_interface As UInteger
End Structureimport ctypes
from ctypes import wintypes
class IN6_ADDR(ctypes.Structure):
_fields_ = [
("u", _u_e__Union),
]
class IPV6_MREQ(ctypes.Structure):
_fields_ = [
("ipv6mr_multiaddr", IN6_ADDR),
("ipv6mr_interface", wintypes.DWORD),
]#[repr(C)]
pub struct IN6_ADDR {
pub u: _u_e__Union,
}
#[repr(C)]
pub struct IPV6_MREQ {
pub ipv6mr_multiaddr: IN6_ADDR,
pub ipv6mr_interface: u32,
}import "golang.org/x/sys/windows"
type IN6_ADDR struct {
u _u_e__Union
}
type IPV6_MREQ struct {
ipv6mr_multiaddr IN6_ADDR
ipv6mr_interface uint32
}type
IN6_ADDR = record
u: _u_e__Union;
end;
IPV6_MREQ = record
ipv6mr_multiaddr: IN6_ADDR;
ipv6mr_interface: DWORD;
end;const IN6_ADDR = extern struct {
u: _u_e__Union,
};
const IPV6_MREQ = extern struct {
ipv6mr_multiaddr: IN6_ADDR,
ipv6mr_interface: u32,
};type
IN6_ADDR {.bycopy.} = object
u: _u_e__Union
IPV6_MREQ {.bycopy.} = object
ipv6mr_multiaddr: IN6_ADDR
ipv6mr_interface: uint32struct IN6_ADDR
{
_u_e__Union u;
}
struct IPV6_MREQ
{
IN6_ADDR ipv6mr_multiaddr;
uint ipv6mr_interface;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IPV6_MREQ サイズ: 20 バイト(x64)
dim st, 5 ; 4byte整数×5(構造体サイズ 20 / 4 切り上げ)
; ipv6mr_multiaddr : IN6_ADDR (+0, 16byte) varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; ipv6mr_interface : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global IN6_ADDR
#field byte u 16
#endstruct
#defstruct global IPV6_MREQ
#field IN6_ADDR ipv6mr_multiaddr
#field int ipv6mr_interface
#endstruct
stdim st, IPV6_MREQ ; NSTRUCT 変数を確保
st->ipv6mr_interface = 100
mes "ipv6mr_interface=" + st->ipv6mr_interface