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

IP_OPTION_INFORMATION32

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

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

フィールド

フィールドサイズx64x86説明
TtlBYTE1+0+0IPv4 パケット ヘッダーの Time to Live フィールドです。IPv6 ヘッダーでは Hop Limit フィールドに相当します。
TosBYTE1+1+1IPv4 ヘッダーの type of service フィールドです。このメンバーは現在、通知なしに無視されます。
FlagsBYTE1+2+2

Flags フィールドです。IPv4 では、これは IPv4 ヘッダーの Flags フィールドです。IPv6 では、このフィールドはオプション ヘッダーによって表されます。

IPv4 の場合、Flags メンバーに指定できる値は、Ipexport.h ヘッダー ファイルで定義されている次の値の組み合わせです。

意味
IP_FLAG_REVERSE
0x01
この値を指定すると、IP パケットに送信元を含む IP ルーティング ヘッダーが 追加されます。この値は Windows Vista 以降でのみ有効です。
IP_FLAG_DF
0x02
この値は、パケットをフラグメント化してはならないことを示します。
OptionsSizeBYTE1+3+3IP オプション データのサイズ (バイト単位) です。
OptionsDataBYTE*8/4+8+4オプション データへのポインターです。

公式ドキュメント

IP_OPTION_INFORMATION32 構造体は、64 ビット プラットフォーム上で IP パケットのヘッダーに含めるオプションを記述します。

解説(Remarks)

IP_OPTION_INFORMATION32 構造体は、64 ビット プラットフォーム上で IP パケットのヘッダーに含めるオプションを記述するために使用します。IP_OPTION_INFORMATION32 構造体は、_WIN64 が定義されている場合にのみ定義されます。

TTLTOSFlags の各メンバーの値は、IP ヘッダー内の特定のフィールドで運ばれます。

OptionsData メンバーのバイト列は、標準の IP ヘッダーに続くオプション領域で運ばれます。

IPv4 のソース ルート オプションを除き、オプション データは RFC 791 で規定されているとおり、ネットワーク上で伝送される形式でなければなりません。IPv4 のソース ルート オプションでは、ルート データに最初のホップから最終的な宛先までの完全な経路を含める必要があります。最初のホップはデータから取り出され、オプションはそれに応じて再構成されます。それ以外の場合、ルート オプションは RFC 791 で規定されている形式にする必要があります。

IPv6 で使用する場合、オプション データは RFC 2460 で規定されているとおり、ネットワーク上で伝送される形式でなければなりません。

IP_OPTION_INFORMATION32 構造体は、IcmpSendEchoIcmpSendEcho2Icmp6SendEcho2 の各関数で使用される ICMP_ECHO_REPLY32 構造体のメンバーです。

この構造体は Ipexport.h ヘッダー ファイルで定義されており、このファイルは Iphlpapi.h ヘッダー ファイルに自動的にインクルードされます。Ipexport.h ヘッダー ファイルを直接使用しないでください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// IP_OPTION_INFORMATION32  (x64 16 / x86 8 バイト)
typedef struct IP_OPTION_INFORMATION32 {
    BYTE Ttl;
    BYTE Tos;
    BYTE Flags;
    BYTE OptionsSize;
    BYTE* OptionsData;
} IP_OPTION_INFORMATION32;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_OPTION_INFORMATION32
{
    public byte Ttl;
    public byte Tos;
    public byte Flags;
    public byte OptionsSize;
    public IntPtr OptionsData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IP_OPTION_INFORMATION32
    Public Ttl As Byte
    Public Tos As Byte
    Public Flags As Byte
    Public OptionsSize As Byte
    Public OptionsData As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class IP_OPTION_INFORMATION32(ctypes.Structure):
    _fields_ = [
        ("Ttl", ctypes.c_ubyte),
        ("Tos", ctypes.c_ubyte),
        ("Flags", ctypes.c_ubyte),
        ("OptionsSize", ctypes.c_ubyte),
        ("OptionsData", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct IP_OPTION_INFORMATION32 {
    pub Ttl: u8,
    pub Tos: u8,
    pub Flags: u8,
    pub OptionsSize: u8,
    pub OptionsData: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type IP_OPTION_INFORMATION32 struct {
	Ttl byte
	Tos byte
	Flags byte
	OptionsSize byte
	OptionsData uintptr
}
type
  IP_OPTION_INFORMATION32 = record
    Ttl: Byte;
    Tos: Byte;
    Flags: Byte;
    OptionsSize: Byte;
    OptionsData: Pointer;
  end;
const IP_OPTION_INFORMATION32 = extern struct {
    Ttl: u8,
    Tos: u8,
    Flags: u8,
    OptionsSize: u8,
    OptionsData: ?*anyopaque,
};
type
  IP_OPTION_INFORMATION32 {.bycopy.} = object
    Ttl: uint8
    Tos: uint8
    Flags: uint8
    OptionsSize: uint8
    OptionsData: pointer
struct IP_OPTION_INFORMATION32
{
    ubyte Ttl;
    ubyte Tos;
    ubyte Flags;
    ubyte OptionsSize;
    void* OptionsData;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IP_OPTION_INFORMATION32 サイズ: 8 バイト(x86)
dim st, 2    ; 4byte整数×2(構造体サイズ 8 / 4 切り上げ)
; Ttl : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Tos : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; OptionsSize : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; OptionsData : BYTE* (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_OPTION_INFORMATION32 サイズ: 16 バイト(x64)
dim st, 4    ; 4byte整数×4(構造体サイズ 16 / 4 切り上げ)
; Ttl : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Tos : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; OptionsSize : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; OptionsData : BYTE* (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IP_OPTION_INFORMATION32
    #field byte Ttl
    #field byte Tos
    #field byte Flags
    #field byte OptionsSize
    #field intptr OptionsData
#endstruct

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