names=getnameinfo
visibility=public
kind=defined

--- getnameinfo(sa, flags = 0) -> Array

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

@param sa 文字列か配列を与えます。

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

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

@raise SocketError [[man:getnameinfo(3)]] がエラーを起こした場合に生じる例外

@see [[m:Addrinfo#getnameinfo]]

=== 引数 sa について
引数 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つ
の場合には、最後の要素を名前解決しないことが保証されます。

=== 引数flagsについて
省略可能な第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"]

