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

IP_OPTION_INFORMATION

構造体
サイズ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_INFORMATION 構造体は、IP パケットのヘッダーに含めるオプションを記述します。

解説(Remarks)

IP_OPTION_INFORMATION 構造体は、IP パケットのヘッダーに含めるオプションを記述するために使用します。64 ビットプラットフォームでは、IP_OPTION_INFORMATION32 構造体を使用してください。

TTLTOSFlags の各メンバーの値は、IP ヘッダー内の対応するフィールドに格納されて伝送されます。

OptionsData メンバーのバイト列は、標準の IP ヘッダーに続くオプション領域に格納されて伝送されます。

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

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

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

この構造体は 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_INFORMATION  (x64 16 / x86 8 バイト)
typedef struct IP_OPTION_INFORMATION {
    BYTE Ttl;
    BYTE Tos;
    BYTE Flags;
    BYTE OptionsSize;
    BYTE* OptionsData;
} IP_OPTION_INFORMATION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_OPTION_INFORMATION
{
    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_INFORMATION
    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_INFORMATION(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_INFORMATION {
    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_INFORMATION struct {
	Ttl byte
	Tos byte
	Flags byte
	OptionsSize byte
	OptionsData uintptr
}
type
  IP_OPTION_INFORMATION = record
    Ttl: Byte;
    Tos: Byte;
    Flags: Byte;
    OptionsSize: Byte;
    OptionsData: Pointer;
  end;
const IP_OPTION_INFORMATION = extern struct {
    Ttl: u8,
    Tos: u8,
    Flags: u8,
    OptionsSize: u8,
    OptionsData: ?*anyopaque,
};
type
  IP_OPTION_INFORMATION {.bycopy.} = object
    Ttl: uint8
    Tos: uint8
    Flags: uint8
    OptionsSize: uint8
    OptionsData: pointer
struct IP_OPTION_INFORMATION
{
    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_INFORMATION サイズ: 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_INFORMATION サイズ: 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_INFORMATION
    #field byte Ttl
    #field byte Tos
    #field byte Flags
    #field byte OptionsSize
    #field intptr OptionsData
#endstruct

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