inet_ntop
関数シグネチャ
// WS2_32.dll
#include <windows.h>
LPSTR inet_ntop(
INT Family,
const void* pAddr,
LPSTR pStringBuf,
UINT_PTR StringBufSize
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Family | INT | in | アドレスファミリ。 アドレスファミリに指定できる値は Ws2def.h ヘッダーファイルで定義されています。なお、Ws2def.h ヘッダーファイルは Winsock2.h に自動的にインクルードされるため、直接使用してはなりません。AF_ アドレスファミリ定数と PF_ プロトコルファミリ定数の値は同一(たとえば AF_INET と PF_INET)であるため、どちらの定数も使用できます。 現在サポートされている値は AF_INET と AF_INET6 です。
| ||||||
| pAddr | void* | in | 文字列に変換する、ネットワークバイトオーダーの IP アドレスへのポインター。 Family パラメーターが AF_INET の場合、pAddr パラメーターは変換対象の IPv4 アドレスを格納した IN_ADDR 構造体を指している必要があります。 Family パラメーターが AF_INET6 の場合、pAddr パラメーターは変換対象の IPv6 アドレスを格納した IN6_ADDR 構造体を指している必要があります。 | ||||||
| pStringBuf | LPSTR | out | IP アドレスの NULL 終端文字列表現を格納するバッファーへのポインター。 IPv4 アドレスの場合、このバッファーは少なくとも 16 文字を保持できる大きさが必要です。 IPv6 アドレスの場合、このバッファーは少なくとも 46 文字を保持できる大きさが必要です。 | ||||||
| StringBufSize | UINT_PTR | in | 入力時には、pStringBuf パラメーターが指すバッファーの長さ(文字数)を指定します。 |
戻り値の型: LPSTR
公式ドキュメント
InetNtop 関数は、IPv4 または IPv6 のインターネットネットワークアドレスを、インターネット標準形式の文字列に変換します。この関数の ANSI 版は inet_ntop です。(InetNtopA または inet_ntop)
戻り値
エラーが発生しなかった場合、 InetNtop 関数は、標準形式の IP アドレス文字列表現を格納したバッファーへのポインターを返します。
それ以外の場合は NULL が返され、 WSAGetLastError を呼び出すことで、詳細なエラー情報として固有のエラーコードを取得できます。
関数が失敗した場合、WSAGetLastError が返す拡張エラーコードは、次のいずれかの値になります。
| エラーコード | 意味 |
|---|---|
| Family パラメーターで指定されたアドレスファミリがサポートされていません。Family パラメーターに指定された値が AF_INET でも AF_INET6 でもない場合に、このエラーが返されます。 | |
| 関数に無効なパラメーターが渡されました。pStringBuf パラメーターに NULL ポインターが渡された場合、または StringBufSize パラメーターがゼロの場合に、このエラーが返されます。また、pStringBuf パラメーターが指すバッファーの長さが、IP アドレスの文字列表現を受け取るのに十分でない場合にも、このエラーが返されます。 |
解説(Remarks)
InetNtop 関数は Windows Vista 以降でサポートされています。
InetNtop 関数は、プロトコルに依存しないアドレスから文字列への変換を提供します。InetNtop 関数は、pAddr パラメーターで指定されたインターネットアドレス構造体を受け取り、IP アドレスを表す NULL 終端文字列を返します。inet_ntoa 関数が IPv4 アドレスにのみ対応するのに対し、InetNtop 関数は IPv4 アドレスと IPv6 アドレスのどちらにも対応します。
この関数の ANSI 版は、RFC 2553 で定義されている inet_ntop です。詳細については、IETF の Web サイトで入手できる RFC 2553 を参照してください。
InetNtop 関数は、IP アドレスから文字列への変換を行うために Windows Sockets DLL を読み込む必要はありません。
Family パラメーターに AF_INET が指定された場合、pAddr パラメーターは変換対象の IPv4 アドレスを格納した IN_ADDR 構造体を指している必要があります。pStringBuf パラメーターが指すバッファーに返されるアドレス文字列は、ドット区切り 10 進表記です。たとえば "192.168.16.0" はドット区切り 10 進表記の IPv4 アドレスの一例です。
Family パラメーターに AF_INET6 が指定された場合、pAddr パラメーターは変換対象の IPv6 アドレスを格納した IN6_ADDR 構造体を指している必要があります。pStringBuf パラメーターが指すバッファーに返されるアドレス文字列は、インターネット標準形式です。基本的な文字列表現は、コロンで区切られた 8 個の 16 進数で構成されます。連続するゼロの並びは二重コロンに置き換えられます。IPv6 アドレスの文字列表現中に二重コロンは 1 つしか含められません。アドレスが IPv4 互換アドレスの場合、下位 32 ビットは IPv4 形式のドット区切りオクテット表記で表されます。
pStringBuf パラメーターが指すバッファーの長さが、IP アドレスの文字列表現を受け取るのに十分でない場合、InetNtop は ERROR_INVALID_PARAMETER を返します。
UNICODE または _UNICODE が定義されている場合、InetNtop はこの関数の Unicode 版である InetNtopW として定義されます。pStringBuf パラメーターは PSTR データ型として定義されます。
UNICODE および _UNICODE が定義されていない場合、InetNtop はこの関数の ANSI 版である InetNtopA として定義されます。この関数の ANSI 版は常に inet_ntop として定義されます。pStringBuf パラメーターは PWSTR データ型として定義されます。
IN_ADDR 構造体は Inaddr.h ヘッダーファイルで定義されています。
IN6_ADDR 構造体は In6addr.h ヘッダーファイルで定義されています。
Windows Vista 以降では、RtlIpv4AddressToString 関数および RtlIpv4AddressToStringEx 関数を使用して、IN_ADDR 構造体として表された IPv4 アドレスを、インターネット標準のドット区切り 10 進表記による IPv4 アドレスの文字列表現に変換できます。Windows Vista 以降では、RtlIpv6AddressToString 関数および RtlIpv6AddressToStringEx 関数を使用して、IN6_ADDR 構造体として表された IPv6 アドレスを文字列表現に変換できます。RtlIpv6AddressToStringEx 関数は、IPv6 アドレス、スコープ ID、ポートを標準形式の IPv6 文字列に変換できるため、より柔軟です。
Windows 8.1 および Windows Server 2012 R2: InetNtopW 関数は、Windows 8.1、Windows Server 2012 R2 以降のストアアプリでサポートされています。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// WS2_32.dll
#include <windows.h>
LPSTR inet_ntop(
INT Family,
const void* pAddr,
LPSTR pStringBuf,
UINT_PTR StringBufSize
);[DllImport("WS2_32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr inet_ntop(
int Family, // INT
IntPtr pAddr, // void*
[MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder pStringBuf, // LPSTR out
UIntPtr StringBufSize // UINT_PTR
);<DllImport("WS2_32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function inet_ntop(
Family As Integer, ' INT
pAddr As IntPtr, ' void*
<MarshalAs(UnmanagedType.LPStr)> pStringBuf As System.Text.StringBuilder, ' LPSTR out
StringBufSize As UIntPtr ' UINT_PTR
) As IntPtr
End Function' Family : INT
' pAddr : void*
' pStringBuf : LPSTR out
' StringBufSize : UINT_PTR
Declare PtrSafe Function inet_ntop Lib "ws2_32" ( _
ByVal Family As Long, _
ByVal pAddr As LongPtr, _
ByVal pStringBuf As String, _
ByVal StringBufSize As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
inet_ntop = ctypes.windll.ws2_32.inet_ntop
inet_ntop.restype = wintypes.LPSTR
inet_ntop.argtypes = [
ctypes.c_int, # Family : INT
ctypes.POINTER(None), # pAddr : void*
wintypes.LPSTR, # pStringBuf : LPSTR out
ctypes.c_size_t, # StringBufSize : UINT_PTR
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('WS2_32.dll')
inet_ntop = Fiddle::Function.new(
lib['inet_ntop'],
[
Fiddle::TYPE_INT, # Family : INT
Fiddle::TYPE_VOIDP, # pAddr : void*
Fiddle::TYPE_VOIDP, # pStringBuf : LPSTR out
Fiddle::TYPE_UINTPTR_T, # StringBufSize : UINT_PTR
],
Fiddle::TYPE_VOIDP)#[link(name = "ws2_32")]
extern "system" {
fn inet_ntop(
Family: i32, // INT
pAddr: *const (), // void*
pStringBuf: *mut u8, // LPSTR out
StringBufSize: usize // UINT_PTR
) -> *mut u8;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("WS2_32.dll", SetLastError = true)]
public static extern IntPtr inet_ntop(int Family, IntPtr pAddr, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder pStringBuf, UIntPtr StringBufSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_inet_ntop' -Namespace Win32 -PassThru
# $api::inet_ntop(Family, pAddr, pStringBuf, StringBufSize)#uselib "WS2_32.dll"
#func global inet_ntop "inet_ntop" sptr, sptr, sptr, sptr
; inet_ntop Family, pAddr, varptr(pStringBuf), StringBufSize ; 戻り値は stat
; Family : INT -> "sptr"
; pAddr : void* -> "sptr"
; pStringBuf : LPSTR out -> "sptr"
; StringBufSize : UINT_PTR -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "WS2_32.dll" #cfunc global inet_ntop "inet_ntop" int, sptr, var, sptr ; res = inet_ntop(Family, pAddr, pStringBuf, StringBufSize) ; Family : INT -> "int" ; pAddr : void* -> "sptr" ; pStringBuf : LPSTR out -> "var" ; StringBufSize : UINT_PTR -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "WS2_32.dll" #cfunc global inet_ntop "inet_ntop" int, sptr, sptr, sptr ; res = inet_ntop(Family, pAddr, varptr(pStringBuf), StringBufSize) ; Family : INT -> "int" ; pAddr : void* -> "sptr" ; pStringBuf : LPSTR out -> "sptr" ; StringBufSize : UINT_PTR -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; LPSTR inet_ntop(INT Family, void* pAddr, LPSTR pStringBuf, UINT_PTR StringBufSize) #uselib "WS2_32.dll" #cfunc global inet_ntop "inet_ntop" int, intptr, var, intptr ; res = inet_ntop(Family, pAddr, pStringBuf, StringBufSize) ; Family : INT -> "int" ; pAddr : void* -> "intptr" ; pStringBuf : LPSTR out -> "var" ; StringBufSize : UINT_PTR -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; LPSTR inet_ntop(INT Family, void* pAddr, LPSTR pStringBuf, UINT_PTR StringBufSize) #uselib "WS2_32.dll" #cfunc global inet_ntop "inet_ntop" int, intptr, intptr, intptr ; res = inet_ntop(Family, pAddr, varptr(pStringBuf), StringBufSize) ; Family : INT -> "int" ; pAddr : void* -> "intptr" ; pStringBuf : LPSTR out -> "intptr" ; StringBufSize : UINT_PTR -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
procinet_ntop = ws2_32.NewProc("inet_ntop")
)
// Family (INT), pAddr (void*), pStringBuf (LPSTR out), StringBufSize (UINT_PTR)
r1, _, err := procinet_ntop.Call(
uintptr(Family),
uintptr(pAddr),
uintptr(pStringBuf),
uintptr(StringBufSize),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // LPSTRfunction inet_ntop(
Family: Integer; // INT
pAddr: Pointer; // void*
pStringBuf: PAnsiChar; // LPSTR out
StringBufSize: NativeUInt // UINT_PTR
): PAnsiChar; stdcall;
external 'WS2_32.dll' name 'inet_ntop';result := DllCall("WS2_32\inet_ntop"
, "Int", Family ; INT
, "Ptr", pAddr ; void*
, "Ptr", pStringBuf ; LPSTR out
, "UPtr", StringBufSize ; UINT_PTR
, "Ptr") ; return: LPSTR●inet_ntop(Family, pAddr, pStringBuf, StringBufSize) = DLL("WS2_32.dll", "char* inet_ntop(int, void*, char*, int)")
# 呼び出し: inet_ntop(Family, pAddr, pStringBuf, StringBufSize)
# Family : INT -> "int"
# pAddr : void* -> "void*"
# pStringBuf : LPSTR out -> "char*"
# StringBufSize : UINT_PTR -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "ws2_32" fn inet_ntop(
Family: i32, // INT
pAddr: ?*anyopaque, // void*
pStringBuf: [*c]u8, // LPSTR out
StringBufSize: usize // UINT_PTR
) callconv(std.os.windows.WINAPI) [*c]const u8;proc inet_ntop(
Family: int32, # INT
pAddr: pointer, # void*
pStringBuf: ptr char, # LPSTR out
StringBufSize: uint # UINT_PTR
): cstring {.importc: "inet_ntop", stdcall, dynlib: "WS2_32.dll".}pragma(lib, "ws2_32");
extern(Windows)
const(char)* inet_ntop(
int Family, // INT
void* pAddr, // void*
char* pStringBuf, // LPSTR out
size_t StringBufSize // UINT_PTR
);ccall((:inet_ntop, "WS2_32.dll"), stdcall, Cstring,
(Int32, Ptr{Cvoid}, Ptr{UInt8}, Csize_t),
Family, pAddr, pStringBuf, StringBufSize)
# Family : INT -> Int32
# pAddr : void* -> Ptr{Cvoid}
# pStringBuf : LPSTR out -> Ptr{UInt8}
# StringBufSize : UINT_PTR -> Csize_t
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
const char* inet_ntop(
int32_t Family,
void* pAddr,
char* pStringBuf,
uintptr_t StringBufSize);
]]
local ws2_32 = ffi.load("ws2_32")
-- ws2_32.inet_ntop(Family, pAddr, pStringBuf, StringBufSize)
-- Family : INT
-- pAddr : void*
-- pStringBuf : LPSTR out
-- StringBufSize : UINT_PTR
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('WS2_32.dll');
const inet_ntop = lib.func('__stdcall', 'inet_ntop', 'void *', ['int32_t', 'void *', 'char *', 'uintptr_t']);
// inet_ntop(Family, pAddr, pStringBuf, StringBufSize)
// Family : INT -> 'int32_t'
// pAddr : void* -> 'void *'
// pStringBuf : LPSTR out -> 'char *'
// StringBufSize : UINT_PTR -> 'uintptr_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("WS2_32.dll", {
inet_ntop: { parameters: ["i32", "pointer", "buffer", "usize"], result: "pointer" },
});
// lib.symbols.inet_ntop(Family, pAddr, pStringBuf, StringBufSize)
// Family : INT -> "i32"
// pAddr : void* -> "pointer"
// pStringBuf : LPSTR out -> "buffer"
// StringBufSize : UINT_PTR -> "usize"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
const char* inet_ntop(
int32_t Family,
void* pAddr,
char* pStringBuf,
size_t StringBufSize);
C, "WS2_32.dll");
// $ffi->inet_ntop(Family, pAddr, pStringBuf, StringBufSize);
// Family : INT
// pAddr : void*
// pStringBuf : LPSTR out
// StringBufSize : UINT_PTR
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Ws2_32 extends StdCallLibrary {
Ws2_32 INSTANCE = Native.load("ws2_32", Ws2_32.class);
Pointer inet_ntop(
int Family, // INT
Pointer pAddr, // void*
byte[] pStringBuf, // LPSTR out
long StringBufSize // UINT_PTR
);
}@[Link("ws2_32")]
lib LibWS2_32
fun inet_ntop = inet_ntop(
Family : Int32, # INT
pAddr : Void*, # void*
pStringBuf : UInt8*, # LPSTR out
StringBufSize : LibC::SizeT # UINT_PTR
) : UInt8*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef inet_ntopNative = Pointer<Utf8> Function(Int32, Pointer<Void>, Pointer<Utf8>, UintPtr);
typedef inet_ntopDart = Pointer<Utf8> Function(int, Pointer<Void>, Pointer<Utf8>, int);
final inet_ntop = DynamicLibrary.open('WS2_32.dll')
.lookupFunction<inet_ntopNative, inet_ntopDart>('inet_ntop');
// Family : INT -> Int32
// pAddr : void* -> Pointer<Void>
// pStringBuf : LPSTR out -> Pointer<Utf8>
// StringBufSize : UINT_PTR -> UintPtr
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function inet_ntop(
Family: Integer; // INT
pAddr: Pointer; // void*
pStringBuf: PAnsiChar; // LPSTR out
StringBufSize: NativeUInt // UINT_PTR
): PAnsiChar; stdcall;
external 'WS2_32.dll' name 'inet_ntop';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "inet_ntop"
c_inet_ntop :: Int32 -> Ptr () -> CString -> CUIntPtr -> IO CString
-- Family : INT -> Int32
-- pAddr : void* -> Ptr ()
-- pStringBuf : LPSTR out -> CString
-- StringBufSize : UINT_PTR -> CUIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let inet_ntop =
foreign "inet_ntop"
(int32_t @-> (ptr void) @-> string @-> size_t @-> returning string)
(* Family : INT -> int32_t *)
(* pAddr : void* -> (ptr void) *)
(* pStringBuf : LPSTR out -> string *)
(* StringBufSize : UINT_PTR -> size_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library ws2_32 (t "WS2_32.dll"))
(cffi:use-foreign-library ws2_32)
(cffi:defcfun ("inet_ntop" inet-ntop :convention :stdcall) :string
(family :int32) ; INT
(p-addr :pointer) ; void*
(p-string-buf :pointer) ; LPSTR out
(string-buf-size :uint64)) ; UINT_PTR
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $inet_ntop = Win32::API::More->new('WS2_32',
'LPSTR inet_ntop(int Family, LPVOID pAddr, LPSTR pStringBuf, WPARAM StringBufSize)');
# my $ret = $inet_ntop->Call($Family, $pAddr, $pStringBuf, $StringBufSize);
# Family : INT -> int
# pAddr : void* -> LPVOID
# pStringBuf : LPSTR out -> LPSTR
# StringBufSize : UINT_PTR -> WPARAM
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- s IN_ADDR
- f InetPtonW — IPv4/IPv6のUnicode文字列形式アドレスをバイナリ形式に変換する。
- f RtlIpv4AddressToStringW — IPv4アドレスをドット区切り文字列へ変換する。
- f RtlIpv4AddressToStringExW — IPv4アドレスとポートを文字列へ変換する。
- f RtlIpv4StringToAddressW — 文字列をIPv4アドレス構造体へ変換する。
- f RtlIpv4StringToAddressExW — 文字列をIPv4アドレスとポートへ変換する。
- f RtlIpv6AddressToStringW — IPv6アドレスを文字列表現へ変換する。
- f RtlIpv6AddressToStringExW — IPv6アドレスとスコープ・ポートを文字列へ変換する。
- f RtlIpv6StringToAddressW — 文字列をIPv6アドレス構造体へ変換する。
- f RtlIpv6StringToAddressExW — 文字列をIPv6アドレスとスコープ・ポートへ変換する。
- f inet_addr — IPアドレス文字列を32ビットアドレスへ変換する。
- f inet_ntoa — IPアドレスをドット区切りの文字列へ変換する。