Win32 API 日本語リファレンス
ホームNetworkManagement.IpHelper › MIB_TCP6ROW2

MIB_TCP6ROW2

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

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

フィールド

フィールドサイズx64x86説明
LocalAddrIN6_ADDR16+0+0ローカル側のIPv6アドレスを保持する。
dwLocalScopeIdDWORD4+16+16ローカルアドレスのスコープID(インターフェース識別子)を示す。
dwLocalPortDWORD4+20+20ローカル側のポート番号をネットワークバイト順で保持する。
RemoteAddrIN6_ADDR16+24+24リモート側のIPv6アドレスを保持する。
dwRemoteScopeIdDWORD4+40+40リモートアドレスのスコープID(インターフェース識別子)を示す。
dwRemotePortDWORD4+44+44リモート側のポート番号をネットワークバイト順で保持する。
StateMIB_TCP_STATE4+48+48TCP接続の状態を示すMIB_TCP_STATE列挙値。
dwOwningPidDWORD4+52+52この接続を所有するプロセスのID(PID)を示す。
dwOffloadStateTCP_CONNECTION_OFFLOAD_STATE4+56+56接続のTCPオフロード状態を示す列挙値。

各言語での定義

#include <windows.h>

// IN6_ADDR  (x64 16 / x86 16 バイト)
typedef struct IN6_ADDR {
    _u_e__Union u;
} IN6_ADDR;

// MIB_TCP6ROW2  (x64 60 / x86 60 バイト)
typedef struct MIB_TCP6ROW2 {
    IN6_ADDR LocalAddr;
    DWORD dwLocalScopeId;
    DWORD dwLocalPort;
    IN6_ADDR RemoteAddr;
    DWORD dwRemoteScopeId;
    DWORD dwRemotePort;
    MIB_TCP_STATE State;
    DWORD dwOwningPid;
    TCP_CONNECTION_OFFLOAD_STATE dwOffloadState;
} MIB_TCP6ROW2;
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 MIB_TCP6ROW2
{
    public IN6_ADDR LocalAddr;
    public uint dwLocalScopeId;
    public uint dwLocalPort;
    public IN6_ADDR RemoteAddr;
    public uint dwRemoteScopeId;
    public uint dwRemotePort;
    public int State;
    public uint dwOwningPid;
    public int dwOffloadState;
}
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 MIB_TCP6ROW2
    Public LocalAddr As IN6_ADDR
    Public dwLocalScopeId As UInteger
    Public dwLocalPort As UInteger
    Public RemoteAddr As IN6_ADDR
    Public dwRemoteScopeId As UInteger
    Public dwRemotePort As UInteger
    Public State As Integer
    Public dwOwningPid As UInteger
    Public dwOffloadState As Integer
End Structure
import ctypes
from ctypes import wintypes

class IN6_ADDR(ctypes.Structure):
    _fields_ = [
        ("u", _u_e__Union),
    ]

class MIB_TCP6ROW2(ctypes.Structure):
    _fields_ = [
        ("LocalAddr", IN6_ADDR),
        ("dwLocalScopeId", wintypes.DWORD),
        ("dwLocalPort", wintypes.DWORD),
        ("RemoteAddr", IN6_ADDR),
        ("dwRemoteScopeId", wintypes.DWORD),
        ("dwRemotePort", wintypes.DWORD),
        ("State", ctypes.c_int),
        ("dwOwningPid", wintypes.DWORD),
        ("dwOffloadState", ctypes.c_int),
    ]
#[repr(C)]
pub struct IN6_ADDR {
    pub u: _u_e__Union,
}

#[repr(C)]
pub struct MIB_TCP6ROW2 {
    pub LocalAddr: IN6_ADDR,
    pub dwLocalScopeId: u32,
    pub dwLocalPort: u32,
    pub RemoteAddr: IN6_ADDR,
    pub dwRemoteScopeId: u32,
    pub dwRemotePort: u32,
    pub State: i32,
    pub dwOwningPid: u32,
    pub dwOffloadState: i32,
}
import "golang.org/x/sys/windows"

type IN6_ADDR struct {
	u _u_e__Union
}

type MIB_TCP6ROW2 struct {
	LocalAddr IN6_ADDR
	dwLocalScopeId uint32
	dwLocalPort uint32
	RemoteAddr IN6_ADDR
	dwRemoteScopeId uint32
	dwRemotePort uint32
	State int32
	dwOwningPid uint32
	dwOffloadState int32
}
type
  IN6_ADDR = record
    u: _u_e__Union;
  end;

  MIB_TCP6ROW2 = record
    LocalAddr: IN6_ADDR;
    dwLocalScopeId: DWORD;
    dwLocalPort: DWORD;
    RemoteAddr: IN6_ADDR;
    dwRemoteScopeId: DWORD;
    dwRemotePort: DWORD;
    State: Integer;
    dwOwningPid: DWORD;
    dwOffloadState: Integer;
  end;
const IN6_ADDR = extern struct {
    u: _u_e__Union,
};

const MIB_TCP6ROW2 = extern struct {
    LocalAddr: IN6_ADDR,
    dwLocalScopeId: u32,
    dwLocalPort: u32,
    RemoteAddr: IN6_ADDR,
    dwRemoteScopeId: u32,
    dwRemotePort: u32,
    State: i32,
    dwOwningPid: u32,
    dwOffloadState: i32,
};
type
  IN6_ADDR {.bycopy.} = object
    u: _u_e__Union

  MIB_TCP6ROW2 {.bycopy.} = object
    LocalAddr: IN6_ADDR
    dwLocalScopeId: uint32
    dwLocalPort: uint32
    RemoteAddr: IN6_ADDR
    dwRemoteScopeId: uint32
    dwRemotePort: uint32
    State: int32
    dwOwningPid: uint32
    dwOffloadState: int32
struct IN6_ADDR
{
    _u_e__Union u;
}

struct MIB_TCP6ROW2
{
    IN6_ADDR LocalAddr;
    uint dwLocalScopeId;
    uint dwLocalPort;
    IN6_ADDR RemoteAddr;
    uint dwRemoteScopeId;
    uint dwRemotePort;
    int State;
    uint dwOwningPid;
    int dwOffloadState;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; MIB_TCP6ROW2 サイズ: 60 バイト(x64)
dim st, 15    ; 4byte整数×15(構造体サイズ 60 / 4 切り上げ)
; LocalAddr : IN6_ADDR (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; dwLocalScopeId : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwLocalPort : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; RemoteAddr : IN6_ADDR (+24, 16byte)  varptr(st)+24 を基点に操作(16byte:入れ子/配列)
; dwRemoteScopeId : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; dwRemotePort : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; State : MIB_TCP_STATE (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; dwOwningPid : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; dwOffloadState : TCP_CONNECTION_OFFLOAD_STATE (+56, 4byte)  st.14 = 値  /  値 = st.14   (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 MIB_TCP6ROW2
    #field IN6_ADDR LocalAddr
    #field int dwLocalScopeId
    #field int dwLocalPort
    #field IN6_ADDR RemoteAddr
    #field int dwRemoteScopeId
    #field int dwRemotePort
    #field int State
    #field int dwOwningPid
    #field int dwOffloadState
#endstruct

stdim st, MIB_TCP6ROW2        ; NSTRUCT 変数を確保
st->dwLocalScopeId = 100
mes "dwLocalScopeId=" + st->dwLocalScopeId