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ホストからの接続を受け入れたり、データグラムパケットを受信するために使える。