MIB_IPMCAST_MFE_STATS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| dwGroup | DWORD | 4 | +0 | +0 | この MFE のマルチキャストグループです。値が 0 の場合はワイルドカードグループを示します。 |
| dwSource | DWORD | 4 | +4 | +4 | この MFE の送信元アドレスの範囲です。値が 0 の場合はワイルドカードの送信元を示します。 |
| dwSrcMask | DWORD | 4 | +8 | +8 | dwSourceAddr に対応する IPv4 サブネットマスクです。dwSourceAddr メンバーと dwSourceMask メンバーは、送信元の範囲を定義するために組み合わせて使用されます。 |
| dwUpStrmNgbr | DWORD | 4 | +12 | +12 | この MFE に関連する上流のネイバーです。 |
| dwInIfIndex | DWORD | 4 | +16 | +16 | この MFE に関連する受信インターフェイスのインデックスです。 |
| dwInIfProtocol | DWORD | 4 | +20 | +20 | この MFE に関連する受信インターフェイスを所有するルーティングプロトコルです。 |
| dwRouteProtocol | DWORD | 4 | +24 | +24 | ルートを作成したクライアントです。 |
| dwRouteNetwork | DWORD | 4 | +28 | +28 | dwRouteProtocol が示すルートに関連付けられたアドレスです。 |
| dwRouteMask | DWORD | 4 | +32 | +32 | dwRouteProtocol が示すルートに関連付けられたマスクです。 |
| ulUpTime | DWORD | 4 | +36 | +36 | MFE が作成されてからの経過時間 (100 分の 1 秒単位) です。 |
| ulExpiryTime | DWORD | 4 | +40 | +40 | MFE が削除されるまでの時間 (100 分の 1 秒単位) です。MFE がエージング要件の対象でない場合は 0 が指定されます。 |
| ulNumOutIf | DWORD | 4 | +44 | +44 | この MFE の送信インターフェイス一覧に含まれるインターフェイスの数です。 |
| ulInPkts | DWORD | 4 | +48 | +48 | この MFE に一致して転送されたパケットの数です。 |
| ulInOctets | DWORD | 4 | +52 | +52 | この MFE に一致して転送されたデータのオクテット数です。 |
| ulPktsDifferentIf | DWORD | 4 | +56 | +56 | この MFE に一致したパケットのうち、受信インターフェイスのチェックにより破棄されたパケットの数です。 |
| ulQueueOverflow | DWORD | 4 | +60 | +60 | この MFE に一致したパケットのうち、キューのオーバーフローにより破棄されたパケットの数です。キューは MFE ごとに 1 つあります。 |
| rgmiosOutStats | MIB_IPMCAST_OIF_STATS_LH | 28 | +64 | +64 | 送信インターフェイスの統計情報テーブルへのポインターです。このテーブルは MIB_IPMCAST_OIF_STATS 構造体の配列として実装されています。テーブル内のエントリ数は ulNumOutIf メンバーの値で指定されます。 |
公式ドキュメント
MIB_IPMCAST_MFE_STATS 構造体は、マルチキャスト転送エントリ (MFE) に関連付けられた統計情報を格納します。
解説(Remarks)
MIB_IPMCAST_MFE_STATS 構造体のサイズは固定ではありません。この構造体のサイズを求めるには SIZEOF_MIB_MFE_STATS(X) マクロを使用してください。このマクロは Iprtrmib.h ヘッダーファイルで定義されています。
dwRouteProtocol、dwRouteNetwork、dwRouteMask の各メンバーによって、この MFE に関連するルートが一意に識別されます。
Windows Vista 以降向けにリリースされた Microsoft Windows Software Development Kit (SDK) では、ヘッダーファイルの構成が変更されています。この構造体は Iprtrmib.h ヘッダーファイルではなく、Ipmib.h ヘッダーファイルで定義されています。Ipmib.h ヘッダーファイルは Iprtrmib.h に自動的にインクルードされ、Iprtrmib.h は Iphlpapi.h ヘッダーファイルに自動的にインクルードされます。Ipmib.h および Iprtrmib.h ヘッダーファイルを直接使用しないでください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// MIB_IPMCAST_OIF_STATS_LH (x64 28 / x86 28 バイト)
typedef struct MIB_IPMCAST_OIF_STATS_LH {
DWORD dwOutIfIndex;
DWORD dwNextHopAddr;
DWORD dwDialContext;
DWORD ulTtlTooLow;
DWORD ulFragNeeded;
DWORD ulOutPackets;
DWORD ulOutDiscards;
} MIB_IPMCAST_OIF_STATS_LH;
// MIB_IPMCAST_MFE_STATS (x64 92 / x86 92 バイト)
typedef struct MIB_IPMCAST_MFE_STATS {
DWORD dwGroup;
DWORD dwSource;
DWORD dwSrcMask;
DWORD dwUpStrmNgbr;
DWORD dwInIfIndex;
DWORD dwInIfProtocol;
DWORD dwRouteProtocol;
DWORD dwRouteNetwork;
DWORD dwRouteMask;
DWORD ulUpTime;
DWORD ulExpiryTime;
DWORD ulNumOutIf;
DWORD ulInPkts;
DWORD ulInOctets;
DWORD ulPktsDifferentIf;
DWORD ulQueueOverflow;
MIB_IPMCAST_OIF_STATS_LH rgmiosOutStats[1];
} MIB_IPMCAST_MFE_STATS;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MIB_IPMCAST_OIF_STATS_LH
{
public uint dwOutIfIndex;
public uint dwNextHopAddr;
public uint dwDialContext;
public uint ulTtlTooLow;
public uint ulFragNeeded;
public uint ulOutPackets;
public uint ulOutDiscards;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MIB_IPMCAST_MFE_STATS
{
public uint dwGroup;
public uint dwSource;
public uint dwSrcMask;
public uint dwUpStrmNgbr;
public uint dwInIfIndex;
public uint dwInIfProtocol;
public uint dwRouteProtocol;
public uint dwRouteNetwork;
public uint dwRouteMask;
public uint ulUpTime;
public uint ulExpiryTime;
public uint ulNumOutIf;
public uint ulInPkts;
public uint ulInOctets;
public uint ulPktsDifferentIf;
public uint ulQueueOverflow;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public MIB_IPMCAST_OIF_STATS_LH[] rgmiosOutStats;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure MIB_IPMCAST_OIF_STATS_LH
Public dwOutIfIndex As UInteger
Public dwNextHopAddr As UInteger
Public dwDialContext As UInteger
Public ulTtlTooLow As UInteger
Public ulFragNeeded As UInteger
Public ulOutPackets As UInteger
Public ulOutDiscards As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure MIB_IPMCAST_MFE_STATS
Public dwGroup As UInteger
Public dwSource As UInteger
Public dwSrcMask As UInteger
Public dwUpStrmNgbr As UInteger
Public dwInIfIndex As UInteger
Public dwInIfProtocol As UInteger
Public dwRouteProtocol As UInteger
Public dwRouteNetwork As UInteger
Public dwRouteMask As UInteger
Public ulUpTime As UInteger
Public ulExpiryTime As UInteger
Public ulNumOutIf As UInteger
Public ulInPkts As UInteger
Public ulInOctets As UInteger
Public ulPktsDifferentIf As UInteger
Public ulQueueOverflow As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public rgmiosOutStats() As MIB_IPMCAST_OIF_STATS_LH
End Structureimport ctypes
from ctypes import wintypes
class MIB_IPMCAST_OIF_STATS_LH(ctypes.Structure):
_fields_ = [
("dwOutIfIndex", wintypes.DWORD),
("dwNextHopAddr", wintypes.DWORD),
("dwDialContext", wintypes.DWORD),
("ulTtlTooLow", wintypes.DWORD),
("ulFragNeeded", wintypes.DWORD),
("ulOutPackets", wintypes.DWORD),
("ulOutDiscards", wintypes.DWORD),
]
class MIB_IPMCAST_MFE_STATS(ctypes.Structure):
_fields_ = [
("dwGroup", wintypes.DWORD),
("dwSource", wintypes.DWORD),
("dwSrcMask", wintypes.DWORD),
("dwUpStrmNgbr", wintypes.DWORD),
("dwInIfIndex", wintypes.DWORD),
("dwInIfProtocol", wintypes.DWORD),
("dwRouteProtocol", wintypes.DWORD),
("dwRouteNetwork", wintypes.DWORD),
("dwRouteMask", wintypes.DWORD),
("ulUpTime", wintypes.DWORD),
("ulExpiryTime", wintypes.DWORD),
("ulNumOutIf", wintypes.DWORD),
("ulInPkts", wintypes.DWORD),
("ulInOctets", wintypes.DWORD),
("ulPktsDifferentIf", wintypes.DWORD),
("ulQueueOverflow", wintypes.DWORD),
("rgmiosOutStats", MIB_IPMCAST_OIF_STATS_LH * 1),
]#[repr(C)]
pub struct MIB_IPMCAST_OIF_STATS_LH {
pub dwOutIfIndex: u32,
pub dwNextHopAddr: u32,
pub dwDialContext: u32,
pub ulTtlTooLow: u32,
pub ulFragNeeded: u32,
pub ulOutPackets: u32,
pub ulOutDiscards: u32,
}
#[repr(C)]
pub struct MIB_IPMCAST_MFE_STATS {
pub dwGroup: u32,
pub dwSource: u32,
pub dwSrcMask: u32,
pub dwUpStrmNgbr: u32,
pub dwInIfIndex: u32,
pub dwInIfProtocol: u32,
pub dwRouteProtocol: u32,
pub dwRouteNetwork: u32,
pub dwRouteMask: u32,
pub ulUpTime: u32,
pub ulExpiryTime: u32,
pub ulNumOutIf: u32,
pub ulInPkts: u32,
pub ulInOctets: u32,
pub ulPktsDifferentIf: u32,
pub ulQueueOverflow: u32,
pub rgmiosOutStats: [MIB_IPMCAST_OIF_STATS_LH; 1],
}import "golang.org/x/sys/windows"
type MIB_IPMCAST_OIF_STATS_LH struct {
dwOutIfIndex uint32
dwNextHopAddr uint32
dwDialContext uint32
ulTtlTooLow uint32
ulFragNeeded uint32
ulOutPackets uint32
ulOutDiscards uint32
}
type MIB_IPMCAST_MFE_STATS struct {
dwGroup uint32
dwSource uint32
dwSrcMask uint32
dwUpStrmNgbr uint32
dwInIfIndex uint32
dwInIfProtocol uint32
dwRouteProtocol uint32
dwRouteNetwork uint32
dwRouteMask uint32
ulUpTime uint32
ulExpiryTime uint32
ulNumOutIf uint32
ulInPkts uint32
ulInOctets uint32
ulPktsDifferentIf uint32
ulQueueOverflow uint32
rgmiosOutStats [1]MIB_IPMCAST_OIF_STATS_LH
}type
MIB_IPMCAST_OIF_STATS_LH = record
dwOutIfIndex: DWORD;
dwNextHopAddr: DWORD;
dwDialContext: DWORD;
ulTtlTooLow: DWORD;
ulFragNeeded: DWORD;
ulOutPackets: DWORD;
ulOutDiscards: DWORD;
end;
MIB_IPMCAST_MFE_STATS = record
dwGroup: DWORD;
dwSource: DWORD;
dwSrcMask: DWORD;
dwUpStrmNgbr: DWORD;
dwInIfIndex: DWORD;
dwInIfProtocol: DWORD;
dwRouteProtocol: DWORD;
dwRouteNetwork: DWORD;
dwRouteMask: DWORD;
ulUpTime: DWORD;
ulExpiryTime: DWORD;
ulNumOutIf: DWORD;
ulInPkts: DWORD;
ulInOctets: DWORD;
ulPktsDifferentIf: DWORD;
ulQueueOverflow: DWORD;
rgmiosOutStats: array[0..0] of MIB_IPMCAST_OIF_STATS_LH;
end;const MIB_IPMCAST_OIF_STATS_LH = extern struct {
dwOutIfIndex: u32,
dwNextHopAddr: u32,
dwDialContext: u32,
ulTtlTooLow: u32,
ulFragNeeded: u32,
ulOutPackets: u32,
ulOutDiscards: u32,
};
const MIB_IPMCAST_MFE_STATS = extern struct {
dwGroup: u32,
dwSource: u32,
dwSrcMask: u32,
dwUpStrmNgbr: u32,
dwInIfIndex: u32,
dwInIfProtocol: u32,
dwRouteProtocol: u32,
dwRouteNetwork: u32,
dwRouteMask: u32,
ulUpTime: u32,
ulExpiryTime: u32,
ulNumOutIf: u32,
ulInPkts: u32,
ulInOctets: u32,
ulPktsDifferentIf: u32,
ulQueueOverflow: u32,
rgmiosOutStats: [1]MIB_IPMCAST_OIF_STATS_LH,
};type
MIB_IPMCAST_OIF_STATS_LH {.bycopy.} = object
dwOutIfIndex: uint32
dwNextHopAddr: uint32
dwDialContext: uint32
ulTtlTooLow: uint32
ulFragNeeded: uint32
ulOutPackets: uint32
ulOutDiscards: uint32
MIB_IPMCAST_MFE_STATS {.bycopy.} = object
dwGroup: uint32
dwSource: uint32
dwSrcMask: uint32
dwUpStrmNgbr: uint32
dwInIfIndex: uint32
dwInIfProtocol: uint32
dwRouteProtocol: uint32
dwRouteNetwork: uint32
dwRouteMask: uint32
ulUpTime: uint32
ulExpiryTime: uint32
ulNumOutIf: uint32
ulInPkts: uint32
ulInOctets: uint32
ulPktsDifferentIf: uint32
ulQueueOverflow: uint32
rgmiosOutStats: array[1, MIB_IPMCAST_OIF_STATS_LH]struct MIB_IPMCAST_OIF_STATS_LH
{
uint dwOutIfIndex;
uint dwNextHopAddr;
uint dwDialContext;
uint ulTtlTooLow;
uint ulFragNeeded;
uint ulOutPackets;
uint ulOutDiscards;
}
struct MIB_IPMCAST_MFE_STATS
{
uint dwGroup;
uint dwSource;
uint dwSrcMask;
uint dwUpStrmNgbr;
uint dwInIfIndex;
uint dwInIfProtocol;
uint dwRouteProtocol;
uint dwRouteNetwork;
uint dwRouteMask;
uint ulUpTime;
uint ulExpiryTime;
uint ulNumOutIf;
uint ulInPkts;
uint ulInOctets;
uint ulPktsDifferentIf;
uint ulQueueOverflow;
MIB_IPMCAST_OIF_STATS_LH[1] rgmiosOutStats;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; MIB_IPMCAST_MFE_STATS サイズ: 92 バイト(x64)
dim st, 23 ; 4byte整数×23(構造体サイズ 92 / 4 切り上げ)
; dwGroup : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwSource : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dwSrcMask : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dwUpStrmNgbr : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; dwInIfIndex : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; dwInIfProtocol : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; dwRouteProtocol : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; dwRouteNetwork : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; dwRouteMask : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; ulUpTime : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ulExpiryTime : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; ulNumOutIf : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; ulInPkts : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; ulInOctets : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; ulPktsDifferentIf : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; ulQueueOverflow : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; rgmiosOutStats : MIB_IPMCAST_OIF_STATS_LH (+64, 28byte) varptr(st)+64 を基点に操作(28byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global MIB_IPMCAST_OIF_STATS_LH
#field int dwOutIfIndex
#field int dwNextHopAddr
#field int dwDialContext
#field int ulTtlTooLow
#field int ulFragNeeded
#field int ulOutPackets
#field int ulOutDiscards
#endstruct
#defstruct global MIB_IPMCAST_MFE_STATS
#field int dwGroup
#field int dwSource
#field int dwSrcMask
#field int dwUpStrmNgbr
#field int dwInIfIndex
#field int dwInIfProtocol
#field int dwRouteProtocol
#field int dwRouteNetwork
#field int dwRouteMask
#field int ulUpTime
#field int ulExpiryTime
#field int ulNumOutIf
#field int ulInPkts
#field int ulInOctets
#field int ulPktsDifferentIf
#field int ulQueueOverflow
#field MIB_IPMCAST_OIF_STATS_LH rgmiosOutStats 1
#endstruct
stdim st, MIB_IPMCAST_MFE_STATS ; NSTRUCT 変数を確保
st->dwGroup = 100
mes "dwGroup=" + st->dwGroup