Socket

ソケットそのものに対するシステムコールレベルのアクセスを提供 するクラス。Perlのソケットに対するアクセスと同レベルの機能を 提供してます。このクラスではソケットアドレスは pack された文字列で指定します。

一般的なソケットプログラミングはより高レベルの TCPSocketクラスや TCPServerクラスを用い て行われることが多く、このクラスはあまり用いられません。

スーパークラス:

クラスメソッド:

Socket.open(domain, type, protocol)
Socket.new(domain, type, protocol)

新しいソケットを生成します。domaintypeprotocol はインクルードファイルにある定数で指定しま す。ほとんどの定数は Socket::AF_INET のように Socket クラスの定数として定義されています。domaintype に関しては、"AF_INET", "SOCK_STREAM" のように文字列でも指定できますが、文 字列ですべての機能を指定できる保証はありません。

Socket.for_fd(fd)

ファイルディスクリプタ fd に対する新しいソケットを生成します。

ruby 1.7 feature: このメソッドは BasicSocket に移動しました。

Socket.getaddrinfo(nodename, servname[, family[, socktype[, protocol[, flags]]]])

RFC:2553で定義された getaddrinfo()の機能を提供するクラスメソッド。この関数は gethostbyname()getservbyname()の代わりとして用意されており、 IPのバージョンに依存しないプログラムを書くための標準的なAPIです。

アドレス情報の配列を返します。アドレス情報とは7つの要素からなる次の 形の配列です。

必須引数の意味は以下の通りです。

残りの引数は省略可能です。

引数に指定できる定数の意味については getaddrinfo(3) を参照して下さい。

Socket.getnameinfo(sa[, flags])

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

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

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

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

サービス、ホストの指定に関しては サービス指定形式ホスト指定形式を参照してください。

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

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

引数flagsを構成するための定数として Socket::NI_MAXHOSTSocket::NI_MAXSERVSocket::NI_NOFQDNSocket::NI_NUMERICHOSTSocket::NI_NAMEREQDSocket::NI_NUMERICSERVSocket::NI_DGRAM が用意されている場合があります。

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

例:

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

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

sockaddr 構造体をパックした文字列からホスト情報を返します。 ホスト情報の構造は Socket.gethostbynameと同じです。 type には、アドレスタイプ(デフォルトは Socket::AF_INET)を指定します。

Socket.gethostbyname(host)

ホスト名またはIPアドレス(指定方法に関しては ホスト指定形式を参照) からホストの情報を返します。ホスト情報は、ホスト名、ホス トの別名の配列、ホストのアドレスタイプ、ホストのアドレス を各要素とする配列です。

例:
irb(main):009:0> Socket.gethostbyname ("210.251.121.214")
["helium.ruby-lang.org", ["helium"], 2, "\322\373y\326"]
Socket.gethostname

システムの標準のホスト名を取得します。 その他のホスト名などの情報は Socket.gethostbyname(Socket.gethostname) で取得できます。

Socket.getservbyname(service[, proto])

service, protoに対応するポート番号を返 します。protoの省略値は"tcp"です。

Socket.sockaddr_in(port, host) ((<ruby 1.7 feature>))
Socket.pack_sockaddr_in(port, host) ((<ruby 1.7 feature>))

指定したアドレスをソケットアドレス構造体に pack して文字列で返しま す。port は、ポート番号を表す Fixnum あるいは、ポート 番号、サービス名を表す文字列です。

require 'socket'
p Socket.pack_sockaddr_in("echo", "localhost")
=> "\002\000\000\a\177\000\000\001\000\000\000\000\000\000\000\000"
Socket.sockaddr_un(path) ((<ruby 1.7 feature>))
Socket.pack_sockaddr_un(path) ((<ruby 1.7 feature>))

指定したアドレスをソケットアドレス構造体に pack して文字列で返しま す。

require 'socket'
p Socket.pack_sockaddr_un("/tmp/.X11-unix/X0")
=> "\001\000/tmp/.X11-unix/X0\000...."
Socket.pair(domain, type, protocol)
Socket.socketpair(domain, type, protocol)

相互に結合されたソケットのペアを含む2要素の配列を返します。 引数の指定はSocket.openと同じです。

Socket.unpack_sockaddr_in(addr) ((<ruby 1.7 feature>))

pack されたソケットアドレス構造体addrを unpack してアドレス を返します。返される値は [port, ipaddr] の配列です。

require 'socket'
p Socket.unpack_sockaddr_in(Socket.pack_sockaddr_in("echo", "localhost"))
=> [7, "127.0.0.1"]
Socket.unpack_sockaddr_un(addr) ((<ruby 1.7 feature>))

pack されたソケットアドレス構造体addrを unpack してソケット パス名をを返します。

require 'socket'
p Socket.unpack_sockaddr_un(Socket.pack_sockaddr_un("/tmp/.X11-unix/X0"))
=> "/tmp/.X11-unix/X0"

メソッド:

accept

新しい接続を受け付けて、新しい接続に対するソケットとアドレスの ペアを返します。accept(2)を参照。

bind(addr)

ソケットをaddrに結合します。bind(2) と同じ働きをします。addrはpackされたソケットアド レス構造体です。

connect(addr)

connect(2)と同じ働きをします。addrは packされたソケットアドレス構造体です。

listen(backlog)

listen(2)と同じ働きをします。

recvfrom(len[, flags])

recvと同様にソケットからデータを受け取りますが、 戻り値は文字列と相手ソケットのアドレスのペアです。引数につい てはrecvと同様です。

sysaccept ((<ruby 1.7 feature>))

接続したクライアントのファイル記述子とアドレスのペアを返すことを除 けば accept と同じです。


*14つの 場合の3番目の引数ってなんだか変なインタフェースですね。4番目の引数 が nil の場合は要素3つと同じ扱いになるんですね。どういうわけでこう なってるのかがよくわかりません。ホスト指定は常に3番目の要素にして [アドレスファミリー, サービス, ホスト, フラグ] として4番目の要素で 名前解決うんぬんを指定するんじゃダメだったんでしょうかね?-あらい 2002-01-01