kind=defined
names=getnameinfo
visibility=public

--- getnameinfo(sa[, flags])

[[RFC:2553]] で定義された getnameinfo() の機能を提供するク
ラスメソッド。 gethostbyaddr() や getservbyport() の代
わりとして用意されています。IPのバージョンに依存しないプログラムを
書くための標準的なAPIです。

配列を返し、その要素はアドレスとポートを表す文字列です。

引数 sa には文字列か配列を与えます。文字列の場合は sockaddr 構造体
のパック文字列を与えます。具体的には [[m:BasicSocket#getsockname]]
の値が利用できます。配列を与える場合には、要素が3つの場合と4つの場合
があります。

  * 要素が3つの場合:
       [アドレスファミリー, サービス, ホスト]
  * 要素が4つの場合:
       [アドレスファミリー, サービス, 任意, アドレスを表す文字列]

アドレスファミリーには Socket::AF_INET 等の定数の他に文字列
で "AF_INET" もしくは "AF_INET6" もしくは nil が
指定できます。ただしIPv6が使えないようにコンパイルされている場合は
"AF_INET6" は無効な指定となります。アドレスファミリーに
nil を指定することは Socket::AF_UNSPEC を指定すること
と等価です。

サービス、ホストの指定に関しては [[ref:lib:socket#service_format]]、
[[ref:lib:socket#host_format]]を参照してください。

要素が3つの場合でも、ホストにはアドレスを指定できますが、要素が4つ
の場合には、最後の要素を名前解決しないことが保証されます。
2002-01-01

省略可能な第2引数 flags には [[man:getnameinfo(3)]]
の第7番目の引数に指定する flags に相当する [[c:Fixnum]] を与えます。

引数flagsを構成するための定数として
Socket::NI_MAXHOST、
Socket::NI_MAXSERV、
Socket::NI_NOFQDN、
Socket::NI_NUMERICHOST、
Socket::NI_NAMEREQD、
Socket::NI_NUMERICSERV、
Socket::NI_DGRAM
が用意されている場合があります。

これらの定数の意味については [[man:getnameinfo(3)]]を参照
して下さい。

例:

  Socket.getnameinfo(Socket.sockaddr_in('21','127.0.0.1'))
  #=> ["localhost", "ftp"]
  
  Socket.getnameinfo([nil, 21,'127.0.0.1'])
  #=> ["localhost", "ftp"]

