TCP_ESTATS_DATA_ROD_v0
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| DataBytesOut | ULONGLONG | 8 | +0 | +0 | 送信されたセグメントに含まれるデータのオクテット数です。再送されたデータも含みます。TCP ヘッダーは含まれない点に注意してください。 |
| DataSegsOut | ULONGLONG | 8 | +8 | +8 | 長さが正のデータセグメントを含む、送信されたセグメントの数です。 |
| DataBytesIn | ULONGLONG | 8 | +16 | +16 | 受信したデータセグメントに含まれるオクテット数です。再送されたデータも含みます。TCP ヘッダーは含まれない点に注意してください。 |
| DataSegsIn | ULONGLONG | 8 | +24 | +24 | 長さが正のデータセグメントを含む、受信したセグメントの数です。 |
| SegsOut | ULONGLONG | 8 | +32 | +32 | 送信されたセグメントの総数です。 |
| SegsIn | ULONGLONG | 8 | +40 | +40 | 受信したセグメントの総数です。 |
| SoftErrors | DWORD | 4 | +48 | +48 | TCP の入力処理中に各種の整合性チェックに失敗したセグメントの数です。ソフトエラーによってセグメントが破棄されることもありますが、破棄されない場合もあります。ソフトエラーの一部は TCP 確認応答の生成を引き起こしますが、それ以外は通知なしに破棄されます。 |
| SoftErrorReason | DWORD | 4 | +52 | +52 | TCP の入力処理中に直近で失敗した整合性チェックを識別する値です。このオブジェクトは、SoftErrors メンバーがインクリメントされるたびに設定されます。 |
| SndUna | DWORD | 4 | +56 | +56 | 最も古い未確認のシーケンス番号の値です。このメンバーは TCP の状態変数である点に注意してください。 |
| SndNxt | DWORD | 4 | +60 | +60 | 次に送信されるシーケンス番号です。TCP は失われたデータを再送する際にこのメンバーを欠落データの位置まで戻すことがあるため、このメンバーは単調増加ではなく (したがってカウンターではない) 点に注意してください。 |
| SndMax | DWORD | 4 | +64 | +64 | 送信される最も先の (右端すなわち最大の) シーケンス番号です。この値は、回復処理中に SndNxt メンバーが引き戻される場合を除き、SndNxt メンバーと等しくなる点に注意してください。 |
| ThruBytesAcked | ULONGLONG | 8 | +72 | +72 | 累積確認応答を受信したオクテット数です。この値は SndNxt メンバーの変化量の合計になる点に注意してください。 |
| RcvNxt | DWORD | 4 | +80 | +80 | 次に受信されるシーケンス番号です。TCP は失われたデータを再送する際にこのメンバーを欠落データの位置まで戻すことがあるため、このメンバーは単調増加ではなく (したがってカウンターではない) 点に注意してください。 |
| ThruBytesReceived | ULONGLONG | 8 | +88 | +88 | 累積確認応答を送信したオクテット数です。この値は RcvNxt メンバーの変化量の合計になる点に注意してください。 |
公式ドキュメント
TCP_ESTATS_DATA_ROD_v0 構造体は、TCP 接続のデータ転送に関する TCP 拡張統計の、読み取り専用の動的情報を格納します。
解説(Remarks)
TCP_ESTATS_DATA_ROD_v0 構造体は、Windows Vista 以降で利用できる TCP 拡張統計機能の一部として使用されます。
TCP_ESTATS_DATA_ROD_v0 は、TCP 接続のデータ転送に関する TCP 拡張統計の読み取り専用の動的情報を表す構造体のバージョン 0 として定義されています。この情報は、接続が確立された後に利用できます。
TCP_ESTATS_DATA_ROD_v0 構造体は、EstatsType パラメーターに TcpConnectionEstatsData を渡して GetPerTcp6ConnectionEStats 関数または GetPerTcpConnectionEStats 関数を呼び出すことで取得します。この構造体を取得するには、TCP 拡張統計を有効にしておく必要があります。
この構造体のメンバーは、TCP Extended Statistics MIB に関する IETF RFC で定義されています。詳細については、http://www.ietf.org/rfc/rfc4898.txt を参照してください。
次に、TCP_ESTATS_DATA_ROD_v0 構造体のメンバーと、RFC 4898 で TCP 拡張統計として定義されているエントリとの対応を示します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// TCP_ESTATS_DATA_ROD_v0 (x64 96 / x86 96 バイト)
typedef struct TCP_ESTATS_DATA_ROD_v0 {
ULONGLONG DataBytesOut;
ULONGLONG DataSegsOut;
ULONGLONG DataBytesIn;
ULONGLONG DataSegsIn;
ULONGLONG SegsOut;
ULONGLONG SegsIn;
DWORD SoftErrors;
DWORD SoftErrorReason;
DWORD SndUna;
DWORD SndNxt;
DWORD SndMax;
ULONGLONG ThruBytesAcked;
DWORD RcvNxt;
ULONGLONG ThruBytesReceived;
} TCP_ESTATS_DATA_ROD_v0;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TCP_ESTATS_DATA_ROD_v0
{
public ulong DataBytesOut;
public ulong DataSegsOut;
public ulong DataBytesIn;
public ulong DataSegsIn;
public ulong SegsOut;
public ulong SegsIn;
public uint SoftErrors;
public uint SoftErrorReason;
public uint SndUna;
public uint SndNxt;
public uint SndMax;
public ulong ThruBytesAcked;
public uint RcvNxt;
public ulong ThruBytesReceived;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TCP_ESTATS_DATA_ROD_v0
Public DataBytesOut As ULong
Public DataSegsOut As ULong
Public DataBytesIn As ULong
Public DataSegsIn As ULong
Public SegsOut As ULong
Public SegsIn As ULong
Public SoftErrors As UInteger
Public SoftErrorReason As UInteger
Public SndUna As UInteger
Public SndNxt As UInteger
Public SndMax As UInteger
Public ThruBytesAcked As ULong
Public RcvNxt As UInteger
Public ThruBytesReceived As ULong
End Structureimport ctypes
from ctypes import wintypes
class TCP_ESTATS_DATA_ROD_v0(ctypes.Structure):
_fields_ = [
("DataBytesOut", ctypes.c_ulonglong),
("DataSegsOut", ctypes.c_ulonglong),
("DataBytesIn", ctypes.c_ulonglong),
("DataSegsIn", ctypes.c_ulonglong),
("SegsOut", ctypes.c_ulonglong),
("SegsIn", ctypes.c_ulonglong),
("SoftErrors", wintypes.DWORD),
("SoftErrorReason", wintypes.DWORD),
("SndUna", wintypes.DWORD),
("SndNxt", wintypes.DWORD),
("SndMax", wintypes.DWORD),
("ThruBytesAcked", ctypes.c_ulonglong),
("RcvNxt", wintypes.DWORD),
("ThruBytesReceived", ctypes.c_ulonglong),
]#[repr(C)]
pub struct TCP_ESTATS_DATA_ROD_v0 {
pub DataBytesOut: u64,
pub DataSegsOut: u64,
pub DataBytesIn: u64,
pub DataSegsIn: u64,
pub SegsOut: u64,
pub SegsIn: u64,
pub SoftErrors: u32,
pub SoftErrorReason: u32,
pub SndUna: u32,
pub SndNxt: u32,
pub SndMax: u32,
pub ThruBytesAcked: u64,
pub RcvNxt: u32,
pub ThruBytesReceived: u64,
}import "golang.org/x/sys/windows"
type TCP_ESTATS_DATA_ROD_v0 struct {
DataBytesOut uint64
DataSegsOut uint64
DataBytesIn uint64
DataSegsIn uint64
SegsOut uint64
SegsIn uint64
SoftErrors uint32
SoftErrorReason uint32
SndUna uint32
SndNxt uint32
SndMax uint32
ThruBytesAcked uint64
RcvNxt uint32
ThruBytesReceived uint64
}type
TCP_ESTATS_DATA_ROD_v0 = record
DataBytesOut: UInt64;
DataSegsOut: UInt64;
DataBytesIn: UInt64;
DataSegsIn: UInt64;
SegsOut: UInt64;
SegsIn: UInt64;
SoftErrors: DWORD;
SoftErrorReason: DWORD;
SndUna: DWORD;
SndNxt: DWORD;
SndMax: DWORD;
ThruBytesAcked: UInt64;
RcvNxt: DWORD;
ThruBytesReceived: UInt64;
end;const TCP_ESTATS_DATA_ROD_v0 = extern struct {
DataBytesOut: u64,
DataSegsOut: u64,
DataBytesIn: u64,
DataSegsIn: u64,
SegsOut: u64,
SegsIn: u64,
SoftErrors: u32,
SoftErrorReason: u32,
SndUna: u32,
SndNxt: u32,
SndMax: u32,
ThruBytesAcked: u64,
RcvNxt: u32,
ThruBytesReceived: u64,
};type
TCP_ESTATS_DATA_ROD_v0 {.bycopy.} = object
DataBytesOut: uint64
DataSegsOut: uint64
DataBytesIn: uint64
DataSegsIn: uint64
SegsOut: uint64
SegsIn: uint64
SoftErrors: uint32
SoftErrorReason: uint32
SndUna: uint32
SndNxt: uint32
SndMax: uint32
ThruBytesAcked: uint64
RcvNxt: uint32
ThruBytesReceived: uint64struct TCP_ESTATS_DATA_ROD_v0
{
ulong DataBytesOut;
ulong DataSegsOut;
ulong DataBytesIn;
ulong DataSegsIn;
ulong SegsOut;
ulong SegsIn;
uint SoftErrors;
uint SoftErrorReason;
uint SndUna;
uint SndNxt;
uint SndMax;
ulong ThruBytesAcked;
uint RcvNxt;
ulong ThruBytesReceived;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; TCP_ESTATS_DATA_ROD_v0 サイズ: 96 バイト(x64)
dim st, 24 ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; DataBytesOut : ULONGLONG (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; DataSegsOut : ULONGLONG (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; DataBytesIn : ULONGLONG (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; DataSegsIn : ULONGLONG (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; SegsOut : ULONGLONG (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; SegsIn : ULONGLONG (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; SoftErrors : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; SoftErrorReason : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; SndUna : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; SndNxt : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; SndMax : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; ThruBytesAcked : ULONGLONG (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; RcvNxt : DWORD (+80, 4byte) st.20 = 値 / 値 = st.20 (lpoke/lpeek も可)
; ThruBytesReceived : ULONGLONG (+88, 8byte) qpoke st,88,値 / qpeek(st,88) ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global TCP_ESTATS_DATA_ROD_v0
#field int64 DataBytesOut
#field int64 DataSegsOut
#field int64 DataBytesIn
#field int64 DataSegsIn
#field int64 SegsOut
#field int64 SegsIn
#field int SoftErrors
#field int SoftErrorReason
#field int SndUna
#field int SndNxt
#field int SndMax
#field int64 ThruBytesAcked
#field int RcvNxt
#field int64 ThruBytesReceived
#endstruct
stdim st, TCP_ESTATS_DATA_ROD_v0 ; NSTRUCT 変数を確保
st->DataBytesOut = 100
mes "DataBytesOut=" + st->DataBytesOut