6.89. kink/socket/IP¶
IPv4とIPv6の両方について、IPアドレスと、ホスト名解決を提供する。
6.89.1. ip 型¶
ipは、IPv4かIPv6のアドレスをバイナリ形式で表す。
6.89.1.1. Ip.bin¶
binメソッドは、IPアドレスをbin型で戻す。
IpがIPv4アドレスの場合、binメソッドは長さ4のbin値を戻す。
IpがIPv6アドレスの場合、binメソッドは長さ16のbin値を戻す。
6.89.1.2. Ip.protocol_family¶
protocol_familyは、IPアドレスのプロトコルファミリをprotocol_family型で戻す。結果はPROTOCOL_FAMILY.ipv4かPROTOCOL_FAMILY.ipv6のどちらかである。
6.89.1.3. Ip.text¶
textはIPアドレスのテキスト表現をstr型で戻す。
IpがIPv4アドレスの場合、textはドット付き10進記法のstrを戻す。
IpがIPv6アドレスの場合、textは、RFC 2732に規定された形式のstrを戻す。結果は小文字アルファベットを使い、ゼロの桁の省略を行わない。
例
:IP.require_from('kink/socket/')
stdout.print_line(IP.for_hostname('127.0.0.1').text)
# => 127.0.0.1
stdout.print_line(IP.for_hostname('ff02::1').text)
# => ff02:0000:0000:0000:0000:0000:0000:0001
6.89.1.4. Ip.repr¶
reprはIpのデバッグ用途のstr表現を戻す。たとえば、"(ip 127.0.0.1)"や"(ip ff02:0000:0000:0000:0000:0000:0000:0001)"のように。
6.89.1.5. X == Y¶
== 演算子、またはop_eqメソッドは、ふたつのip値が同じIPアドレスを表しているかどうかを戻す。
6.89.2. IP.new(Bin)¶
newは、IPv4かIPv6のip値を作る。
Binのサイズが4の場合、作られたip値はIPv4のアドレスになる。Binのサイズが16の場合、作られたip値はIPv6のアドレスになる。
事前条件
Binはサイズ4か16のbin値でなければならない。
6.89.3. IP.is?(Val)¶
is?はValがip値であるかどうかを戻す。
6.89.4. IP.for_hostname(Hostname ...[$config={}])¶
for_hostnameはHostnameをIPアドレスに解決する。
コンフィグメソッド:
• C.on_success($success): default = VAL.identity
• C.on_error($error): default = {(:Exc) Exc.raise }
HostnameがIPアドレスに解決された場合、for_hostnameは、ip値を引数として$successを末尾呼び出しする。
HostnameがIPアドレスに解決されなかった場合、for_hostnameはexceptionを引数として$errorを末尾呼び出しする。
名前解決
Hostnameは次のように解決される。
• ドット付き10進記法のIPv4アドレス。例: 127.0.0.1
• RFC 2373に規定されたIPv6アドレスのテキスト表現。例: ff06::c3
• RFC 3986に規定された、IPv6リテラルアドレス形式。例: [ff06::c3]
• ホスト名。例: localhost, www.example.org
一般に、ホスト名は複数のIPアドレスに解決されることがある。たとえば、DNSサーバは複数のAレコード、AAAAレコードを戻すかもしれない。for_hostnameは、それらのうちのひとつを結果とする。
事前条件
Hostnameはstr値でなければならない。
$successはip値でなければならない。
$errorはexceptionを取る関数でなければならない。
例
:IP.require_from('kink/socket/')
# IPv4 address
stdout.print_line(IP.for_hostname('127.0.0.1').repr)
# => (ip 127.0.0.1)
# IPv6 address
stdout.print_line(IP.for_hostname('ff06::c3').repr)
# => (ip ff06:0000:0000:0000:0000:0000:0000:00c3)
# IPv6 literal address format
stdout.print_line(IP.for_hostname('[ff06::c3]').repr)
# => (ip ff06:0000:0000:0000:0000:0000:0000:00c3)
# Host name
stdout.print_line(IP.for_hostname('www.example.com').repr)
# => (ip 93.184.215.14)
6.89.5. IP.all_for_hostname(Hostname)¶
all_for_hostnameは、Hostnameに対応するip値のvecを戻す。名前解決のやり方はfor_hostnameと同じである。
結果
HostnameがIPアドレスに解決されない場合、all_for_hostnameは空のvecを戻す。
HostnameがひとつのIPアドレスに解決される場合、all_for_hostnameは、ひとつのip値を含むvecを戻す。
Hostnameが複数のIPアドレスに解決される場合、all_for_hostnameは複数のip値を含むvecを戻す。
事前条件
Hostnameはstr値でなければならない。
例
:IP.require_from('kink/socket/')
stdout.print_line(IP.all_for_hostname('127.0.0.1').repr)
# => [(ip 127.0.0.1)]
stdout.print_line(IP.all_for_hostname('www.example.com').repr)
# => [(ip 93.184.215.14) (ip 2606:2800:021f:cb07:6820:80da:af6b:8b2c)]
6.89.6. IP.any¶
anyはin6addr_anyのアドレスを戻す。これは、IPv6アドレス [::] に対応する。
このアドレスは、任意のIPv4またはIPv6ホストからの接続を受け入れたり、データグラムパケットを受信するために使える。
6.89.7. IP.any_ipv4¶
any_ipv4はINADDR_ANYのアドレスを戻す。これは、IPv4アドレス 0.0.0.0 に対応する。
このアドレスは、任意のIPv4ホストからの接続を受け入れたり、データグラムパケットを受信するために使える。