Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > socketライブラリ > Addrinfoクラス

class Addrinfo

クラスの継承リスト: Addrinfo < Object < Kernel < BasicObject

要約

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

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

struct addrinfo に対応します。

目次

特異メソッド
foreach getaddrinfo ip new tcp udp unix
インスタンスメソッド
afamily bind canonname connect connect_from connect_to family_addrinfo getnameinfo inspect_sockaddr ip? ip_address ip_port ip_unpack ipv4? ipv4_loopback? ipv4_multicast? ipv4_private? ipv6? ipv6_linklocal? ipv6_loopback? ipv6_mc_global? ipv6_mc_linklocal? ipv6_mc_nodelocal? ipv6_mc_orglocal? ipv6_mc_sitelocal? ipv6_multicast? ipv6_sitelocal? ipv6_to_ipv4 ipv6_unspecified? ipv6_v4compat? ipv6_v4mapped? listen pfamily protocol socktype to_s to_sockaddr unix? unix_path

特異メソッド

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 オブジェクトが返されます。

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_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 のものでない場合に発生します