class Addrinfo

要約

ソケットのアドレス情報を保持するクラスです。

ホスト/ポート番号/プロトコルなどを同定するために用いられます。 IPv4/IPv6/Unix domain socketなどのアドレス情報を保持することができます。

struct addrinfo に対応します。

目次

特異メソッド
インスタンスメソッド

特異メソッド

foreach(nodename, service, family=nil, socktype=nil, protocol=nil, flags=0) -> Enumerator[permalink][rdoc]
foreach(nodename, service, family=nil, socktype=nil, protocol=nil, flags=0) {|addrinfo| ... } -> [Addrinfo]

Addrinfo.getaddrinfo で得られる配列の各要素を繰り返します。

ブロックを省略した場合は繰り返しをする Enumerator オブジェクトを返します。

[PARAM] nodename:
ノード名文字列(ホスト名もしくは IP アドレス)
[PARAM] service:
サービス名(文字列もしくはポート番号の整数)
[PARAM] family:
プロトコルファミリー(整数、文字列、シンボル、もしくは nil)
[PARAM] socktype:
ソケットタイプ(整数、文字列、シンボル、もしくは nil)
[PARAM] protocol:
プロトコル(整数、もしくは nil)
[PARAM] flags:
フラグ(整数)
getaddrinfo(nodename, service, family=nil, socktype=nil, protocol=nil, flags=0) -> [Addrinfo][permalink][rdoc]

パラメータから複数の Addrinfo オブジェクトを生成し、その配列を返します。

nodename (ホスト名) と service (ポート番号) を Addrinfo に変換します。変換先は一意ではないため、複数のオブジェクトを返します。

nodename と service のどちらか一方は nil を渡すことができます (その部分は変換されません)。

family, socktype, protocol には希望する方式のヒントを与えます。例えば、SOCK_STREAM なソケットが必要な場合には socktype に指定します。 nil を指定した場合には制限しないことを意味します。 IPv6 に制限したい場合には family に PF_INET6 を指定します。

flags には Socket::AI_??? という定数のビット OR を取ります。

アドレスの使い方がわかっている場合には socktype を明示すべきです。 socktype を省略して service を整数で指定した場合にエラーが生じるプラットフォームが存在します。512 のようなポート番号は socktype なしでは曖昧な指定となるためです。

例:

require 'socket'

Addrinfo.getaddrinfo("www.kame.net", 80, nil, :STREAM)
#=> [#<Addrinfo: 203.178.141.194:80 TCP (www.kame.net:80)>,
#    #<Addrinfo: [2001:200:0:8002:203:47ff:fea5:3085]:80 TCP (www.kame.net:80)>]
[PARAM] nodename:
ノード名文字列(ホスト名もしくは IP アドレス)
[PARAM] service:
サービス名(文字列もしくはポート番号の整数)
[PARAM] family:
プロトコルファミリー(整数、文字列、シンボル、もしくは nil)
[PARAM] socktype:
ソケットタイプ(整数、文字列、シンボル、もしくは nil)
[PARAM] protocol:
プロトコル(整数、もしくは nil)
[PARAM] flags:
フラグ(整数)
[EXCEPTION] SocketError:
getaddrinfo(3)がエラーを返したときに発生する例外です

[SEE_ALSO] Addrinfo.foreach, Socket.getaddrinfo

ip(host) -> Addrinfo[permalink][rdoc]

IP アドレスに対する Addrinfo オブジェクトを返します。

port, socktype, protocol は 0 で初期化されます。つまりこの返り値はソケットを生成するには不適です。

require 'socket'

Addrinfo.ip("localhost") #=> #<Addrinfo: 127.0.0.1 (localhost)>
[PARAM] host:
ホスト(IP アドレスもしくはホスト名)

[SEE_ALSO] Addrinfo.new

new(sockaddr, family=Socket::PF_UNSPEC, socktype=0, protocol=0) -> Addrinfo[permalink][rdoc]

新たな Addrinfo オブジェクトを返します。

sockaddr は connect(2) などで使われるパラメータで、 struct sockaddr に対応します。faimily, socktype, protocol は socket(2) のパラメータに対応します。

sockaddr には文字列もしくは配列を指定します。配列の場合は IPSocket#addrUNIXSocket#addr の値と互換でなければなりません。文字列の場合は Socket.sockaddr_inSocket.unpack_sockaddr_un で得られるようなものでなければなりません。

実際には sockaddr には以下のようなものが使えます。

配列で AF_INET/AF_INET6 を指定した場合、配列の4番目の要素が実際のIPアドレスとして使われます。配列の3番目の要素はホスト名ですが Addrinfo#inspect での表示にしか用いられません。

family は Socket::PF_INET のようなプロコルファミリーを指定します。文字列やシンボル名を指定することができます(PF_ というプレフィクスは省略することもできます)。例えば :INET, :INET6, :UNIX, "PF_INET" などです。

socktype は Socket::SOCK_STREAM のようなソケットタイプを指定します。文字列やシンボル名を指定することができます(SOCK_ というプレフィクスは省略することもできます)。例えば :STREAM, :DGRAM, :RAW, "SOCK_STREAM" などです。

protocol は Socket::IPPROTO_TCP のようなプロトコルを指定します。 family や socktype と異なり、整数でなければなりません。デフォルト値(0) は raw socket 以外では適切な値です。

[PARAM] sockaddr:
ソケットのアドレス(配列もしくは文字列)
[PARAM] family:
プロトコルファミリー(整数、文字列、シンボル)
[PARAM] socktype:
ソケットタイプ(整数、文字列、シンボル)
[PARAM] protocol:
プロトコル(整数)
[EXCEPTION] SocketError:
不適なファミリーやソケットタイプなどを渡した場合に発生します
tcp(host, port) -> Addrinfo[permalink][rdoc]

TCP アドレスに対する Addrinfo オブジェクトを返します。

require 'socket'

Addrinfo.tcp("localhost", "smtp")
#=> #<Addrinfo: 127.0.0.1:25 TCP (localhost:smtp)>
[PARAM] host:
ホスト(IP アドレスもしくはホスト名)
[PARAM] port:
ポート番号(整数)もしくはサービス名(文字列)
udp(host, port) -> Addrinfo[permalink][rdoc]

UDP アドレスに対する Addrinfo オブジェクトを返します。

require 'socket'

Addrinfo.udp("localhost", "daytime")
#=> #<Addrinfo: 127.0.0.1:13 UDP (localhost:daytime)>
[PARAM] host:
ホスト(IP アドレスもしくはホスト名)
[PARAM] port:
ポート番号(整数)もしくはサービス名(文字列)
unix(path, socktype=Socket::SOCK_STREAM) -> Addrinfo[permalink][rdoc]

Unix ソケットアドレスに対応する Addrinfo オブジェクトを返します。

socktype でソケットタイプを指定します。

require 'socket'

Addrinfo.unix("/tmp/sock")         #=> #<Addrinfo: /tmp/sock SOCK_STREAM>
Addrinfo.unix("/tmp/sock", :DGRAM) #=> #<Addrinfo: /tmp/sock SOCK_DGRAM>
[PARAM] path:
Unix ソケットのアドレス文字列
[PARAM] socktype:
ソケットタイプ(整数、文字列、シンボル)

[SEE_ALSO] Addrinfo.new

インスタンスメソッド

afamily -> Integer[permalink][rdoc]

アドレスファミリーを整数で返します。

require 'socket'

Addrinfo.tcp("localhost", 80).afamily == Socket::AF_INET #=> true
bind -> Socket[permalink][rdoc]
bind {|sock| ... } -> object

自身のアドレスにバインドされたソケットを作成します。

ブロックが渡されたときにはそのブロックに生成された Socket オブジェクトが渡されます。ブロックの返り値がメソッドの返り値となります。ブロックを省略した場合は、生成された Socket オブジェクトが返されます。

require 'socket'

Addrinfo.udp("0.0.0.0", 9981).bind {|s|
  s.local_address.connect {|s| s.send "hello", 0 }
  p s.recv(10) #=> "hello"
}
canonname -> String|nil[permalink][rdoc]

カノニカル名を文字列で返します。

カノニカル名が存在しない場合には nil を返します。

カノニカル名は Addrinfo.getaddrinfoSocket::AI_CANONINAME を指定した場合にセットされます。

require 'socket'

list = Addrinfo.getaddrinfo("www.ruby-lang.org", 80, :INET, :STREAM, nil, Socket::AI_CANONNAME)
p list[0] #=> #<Addrinfo: 221.186.184.68:80 TCP carbon.ruby-lang.org (www.ruby-lang.org:80)>
p list[0].canonname #=> "carbon.ruby-lang.org"
connect -> Socket[permalink][rdoc]
connect {|sock| ... } -> object

自身のアドレスへソケットを接続します。

ブロックが渡されたときにはそのブロックに接続済み Socket オブジェクトが渡されます。ブロックの返り値がメソッドの返り値となります。ブロックを省略した場合は、接続済み Socket オブジェクトが返されます。

connect_from(host, port) -> Socket[permalink][rdoc]
connect_from(host, port) {|sock| ... } -> object

引数で指定されたアドレスから自身のアドレスへソケットを接続します。

接続元のアドレスは Addrinfo#family_addrinfo により生成されたものが用いられます。

ブロックが渡されたときにはそのブロックに接続済み Socket オブジェクトが渡されます。ブロックの返り値がメソッドの返り値となります。ブロックを省略した場合は、接続済みSocket オブジェクトが返されます。

引数で指定したアドレスはソケット接続のローカル側のアドレスになります。

require 'socket'

Addrinfo.tcp("www.ruby-lang.org", 80).connect_from("0.0.0.0", 4649) {|s|
  s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  puts s.read
}
[PARAM] host:
ホスト(IP アドレスもしくはホスト名)
[PARAM] port:
ポート番号(整数)もしくはサービス名(文字列)
connect_to(host, port) -> Socket[permalink][rdoc]
connect_to(host, port) {|sock| ... } -> object

自身のアドレスから指定したホストへソケット接続します。

接続元のアドレスは Addrinfo#family_addrinfo により生成されたものが用いられます。

ブロックが渡されたときにはそのブロックに接続済み Socket オブジェクトが渡されます。ブロックの返り値がメソッドの返り値となります。ブロックを省略した場合は、接続済み Socket オブジェクトが返されます。

[PARAM] host:
ホスト(IP アドレスもしくはホスト名)
[PARAM] port:
ポート番号(整数)もしくはサービス名(文字列)
family_addrinfo(host, port) -> Addrinfo[permalink][rdoc]
family_addrinfo(path) -> Addrinfo

引数から自身に「似た」Addrinfo オブジェクトを生成します。

「似た」の意味はプロトコルファミリ、ソケットタイプ、プロトコルが同じことを意味します。

require 'socket'

Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("www.ruby-lang.org", 80)
#=> #<Addrinfo: 221.186.184.68:80 TCP (www.ruby-lang.org:80)>

Addrinfo.unix("/tmp/sock").family_addrinfo("/tmp/sock2")
#=> #<Addrinfo: /tmp/sock2 SOCK_STREAM>
[PARAM] host:
ホスト(IP アドレスもしくはホスト名)
[PARAM] port:
ポート番号(整数)もしくはサービス名(文字列)
[PARAM] path:
Unix domain socket のパス
getnameinfo(flags=0) -> [String, String][permalink][rdoc]

ノード名とサービスを文字列の配列で返します。

flags には Socket::NI_??? という名前の定数のビット OR を渡します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).getnameinfo
#=> ["localhost", "www"]
Addrinfo.tcp("127.0.0.1", 80).getnameinfo(Socket::NI_NUMERICSERV)
#=> ["localhost", "80"]
[PARAM] flags:
フラグ
[EXCEPTION] SocketError:
getnameinfo(3) がエラーを起こした場合に生じる例外

[SEE_ALSO] Socket.getnameinfo

inspect_sockaddr -> String[permalink][rdoc]

アドレスやポート番号などの情報を人間に読める形の文字列で返します。

require 'socket'

Addrinfo.tcp("localhost", 80).inspect_sockaddr     #=> "127.0.0.1:80"
Addrinfo.tcp("ip6-localhost", 80).inspect_sockaddr #=> "[::1]:80"
Addrinfo.unix("/tmp/sock").inspect_sockaddr        #=> "/tmp/sock"
ip? -> bool[permalink][rdoc]

アドレスが IP (v4/v6) のものならば true を返します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).ip? #=> true
Addrinfo.tcp("::1", 80).ip?       #=> true
Addrinfo.unix("/tmp/sock").ip?    #=> false

[SEE_ALSO] Addrinfo#ipv4?, Addrinfo#ipv6?, Addrinfo#unix?

ip_address -> String[permalink][rdoc]

IP アドレスを文字列で返します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).ip_address    #=> "127.0.0.1"
Addrinfo.tcp("::1", 80).ip_address          #=> "::1"

[SEE_ALSO] Addrinfo#ip_port, Addrinfo#ip_unpack

ip_port -> Integer[permalink][rdoc]

ポート番号を整数で返します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).ip_port    #=> 80
Addrinfo.tcp("::1", 80).ip_port          #=> 80

[SEE_ALSO] Addrinfo#ip_address, Addrinfo#ip_unpack

ip_unpack -> [String, Integer][permalink][rdoc]

IP アドレスとポート番号を 2 要素の配列で返します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).ip_unpack    #=> ["127.0.0.1", 80]
Addrinfo.tcp("::1", 80).ip_unpack          #=> ["::1", 80]

[SEE_ALSO] Addrinfo#ip_address, Addrinfo#ip_port

ipv4? -> bool[permalink][rdoc]

アドレスが IPv4 のものならば true を返します。

[SEE_ALSO] Addrinfo#ip?, Addrinfo#ipv6?

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).ipv4? #=> true
Addrinfo.tcp("::1", 80).ipv4?       #=> false
Addrinfo.unix("/tmp/sock").ipv4?    #=> false
ipv4_loopback? -> bool[permalink][rdoc]

IPv4 のループバックアドレス(127.0.0.0/8) であれば真を返します。

[SEE_ALSO] Addrinfo#ipv6_loopback?

ipv4_multicast? -> bool[permalink][rdoc]

IPv4 のマルチキャストアドレス(224.0.0.0/4)であれば真を返します。

ipv4_private? -> bool[permalink][rdoc]

IPv4 のプライベートアドレス(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) であれば真を返します。

ipv6? -> bool[permalink][rdoc]

アドレスが IPv6 のものならば true を返します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).ipv6? #=> false
Addrinfo.tcp("::1", 80).ipv6?       #=> true
Addrinfo.unix("/tmp/sock").ipv6?    #=> false

[SEE_ALSO] Addrinfo#ipv4?, Addrinfo#ip?

ipv6_linklocal? -> bool[permalink][rdoc]

IPv6 のリンクローカルアドレス(ff80::/10)であれば真を返します。

ipv6_loopback? -> bool[permalink][rdoc]

IPv6 のループバックアドレス(::1)であれば真を返します。

[SEE_ALSO] Addrinfo#ipv4_loopback?

ipv6_mc_global? -> bool[permalink][rdoc]

IPv6 のマルチキャスト(グローバルスコープ) アドレスであれば真を返します。

ipv6_mc_linklocal? -> bool[permalink][rdoc]

IPv6 のマルチキャスト(リンクローカルスコープ)アドレスであれば真を返します。

ipv6_mc_nodelocal? -> bool[permalink][rdoc]

IPv6 のマルチキャスト(ノードローカルスコープ)アドレスであれば真を返します。

ipv6_mc_orglocal? -> bool[permalink][rdoc]

IPv6 のマルチキャスト(組織(organization)ローカルスコープ) アドレスであれば真を返します。

ipv6_mc_sitelocal? -> bool[permalink][rdoc]

IPv6 のマルチキャスト(サイトローカルスコープ)アドレスであれば真を返します。

ipv6_multicast? -> bool[permalink][rdoc]

IPv6 のマルチキャストアドレス(ff00::/8)であれば真を返します。

ipv6_sitelocal? -> bool[permalink][rdoc]

IPv6 のサイトローカルアドレス(ffc0::/10)であれば真を返します。

ipv6_to_ipv4 -> Addrinfo|nil[permalink][rdoc]

IPv6 の v4 マップド/互換アドレスを v4 のアドレスに変換します。

それ以外のアドレスの場合 nil を返します。

require 'socket'

Addrinfo.ip("::192.0.2.3").ipv6_to_ipv4      #=> #<Addrinfo: 192.0.2.3>
Addrinfo.ip("::ffff:192.0.2.3").ipv6_to_ipv4 #=> #<Addrinfo: 192.0.2.3>
Addrinfo.ip("::1").ipv6_to_ipv4              #=> nil
Addrinfo.ip("192.0.2.3").ipv6_to_ipv4        #=> nil
Addrinfo.unix("/tmp/sock").ipv6_to_ipv4      #=> nil
ipv6_unique_local? -> bool[permalink][rdoc]

IPv6 のユニークローカルアドレス(fc00::/7, [RFC4193])であれば真を返します。

ipv6_unspecified? -> bool[permalink][rdoc]

IPv6 の不特定アドレス(unspecified address)(::)であれば真を返します。

ipv6_v4compat? -> bool[permalink][rdoc]

IPv6 の v4互換アドレス(::/80)であれば真を返します。

ipv6_v4mapped? -> bool[permalink][rdoc]

IPv6 の v4にマップされたアドレス(::ffff:0:0/80)であれば真を返します。

listen(backlog=5) -> Socket[permalink][rdoc]
listen(backlog=5) {|sock| ... } -> object

自身のアドレスにバインドされたソケットを作成し、 listen(2) を実行します。

ブロックが渡されたときにはそのブロックに生成された Socket オブジェクトが渡されます。ブロックの返り値がメソッドの返り値となります。ブロックを省略した場合は、生成された Socket オブジェクトが返されます。

[PARAM] backlog:
バックログの最大数
pfamily -> Integer[permalink][rdoc]

プロトコルファミリーを整数で返します。

require 'socket'

Addrinfo.tcp("localhost", 80).pfamily == Socket::PF_INET #=> true
protocol -> Integer[permalink][rdoc]

ソケットプロトコルを整数で返します。

require 'socket'

Addrinfo.tcp("localhost", 80).protocol == Socket::IPPROTO_TCP #=> true
socktype -> Integer[permalink][rdoc]

ソケットタイプを整数で返します。

require 'socket'

Addrinfo.tcp("localhost", 80).socktype == Socket::SOCK_STREAM #=> true
to_sockaddr -> String[permalink][rdoc]
to_s -> String

struct sockaddr をパックした形式の文字列に変換します。

require 'socket'

Addrinfo.tcp("localhost", 80).to_sockaddr
#=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
unix? -> bool[permalink][rdoc]

アドレスが Unix domain socket のものならば true を返します。

require 'socket'

Addrinfo.tcp("127.0.0.1", 80).unix? #=> false
Addrinfo.tcp("::1", 80).unix?       #=> false
Addrinfo.unix("/tmp/sock").unix?    #=> true

[SEE_ALSO] Addrinfo#ip?

unix_path -> String[permalink][rdoc]

Unix domain socket の path を文字列で返します。

require 'socket'

Addrinfo.unix("/tmp/sock").unix_path       #=> "/tmp/sock"
[EXCEPTION] SocketError:
アドレスが Unix domain socket のものでない場合に発生します