要約
socket はプロセス外部との通信 (プロセス間通信、ホスト間通信) を実現します。
ソケットアドレス
ソケットというのは通信路の末端です。たとえば 1対1 の通信では、まず通信路の両端にひとつずつソケットをつくり、それらのソケットを接続することによって通信路が確立し、相互に通信できるようになります。この接続時に、一方のソケットにもう一方のソケットの場所を教えてやる必要がありますが、この場所を指定するものがソケットアドレスです。
ソケットアドレスはソケットの種類によって中身が異なります。たとえば TCP では IP アドレスとポート番号ですし、 Unix ドメインソケットではソケットファイルを指すパス名です。
ソケットアドレスを取り扱うための便利で高水準なクラスとして Addrinfo があります。
IPSocket および UNIXSocket 以下のクラス階層では、わざわざソケットアドレスという形式にまとめなくてもよいよう、ソケットアドレスの中身を直接扱えるメソッドが用意されています。
また、IPSocket 以下での IP アドレスとポート番号の指定は、数値で表現するだけでなく、ホスト名やサービス名が使えます。これについては以下の「ホスト指定形式」と「サービス指定形式」を参照してください。
また、C のレベルの「ソケットアドレス構造体を pack した文字列」も使用できます。これは主に低レベルソケットインターフェース (Socket) で用いられます。
ホスト指定形式
AF_INET なソケットにおいてホストを指定するには以下のいずれかの形式を指定します。
- ホスト名 (例: "localhost")
- octet decimalによるIPアドレス(文字列) (例: "127.0.0.1")
- 空文字列 (""), 文字列 "<any>" - INADDR_ANYに相当
- 文字列 "::" - IN6ADDR_ANY_INIT に相当
- 文字列 "<broadcast>" - INADDR_BROADCASTに相当
- IPアドレスを表す 32bit の整数 (例: 0x7f000001)
サービス指定形式
サービスを指定するには以下のいずれかの形式を指定します。
- ポート番号(整数または文字列) (例: 21, "21")
- サービス名 (例: "ftp")
ソケットアドレス構造体を pack した文字列
ソケットアドレス構造体とは、C 言語の構造体 struct sockaddr_in (IPv4) や struct sockaddr_un (Unix ドメイン)を指します。 Socket クラスなどソケットの低レベルインタフェースで利用されます。
Socket.pack_sockaddr_in, Socket.unpack_sockaddr_in といったメソッドにより、例えば、以下のようにしてこの文字列を得ることが出来ます
require 'socket' p Socket.pack_sockaddr_in("echo", "127.0.0.1") => "\002\000\000\a\177\000\000\001\000\000\000\000\000\000\000\000"
ホスト名と IP アドレスの変換
ホスト名から IP アドレスへの変換 (正引き) を行うメソッドは以下のものが用意されています。
- Addrinfo.getaddrinfo("www.ruby-lang.org", "http") => [#<Addrinfo: 221.186.184.68:80 TCP (www.ruby-lang.org:http)>]
- IPSocket.getaddress("www.ruby-lang.org") => "210.163.138.100"
- TCPSocket.gethostbyname("www.ruby-lang.org") => ["beryllium.ruby-lang.org", [], 2, "210.163.138.100"]
- Socket.gethostbyname("www.ruby-lang.org") => ["beryllium.ruby-lang.org", [], 2, "\322\243\212d"]
- Socket.getaddrinfo("www.ruby-lang.org", "http") => [["AF_INET", 80, "beryllium.ruby-lang.org", "210.163.138.100", 2, 1, 6]]
逆に IP アドレスからホスト名への変換 (逆引き) を行うメソッドは以下のものが用意されています。
- Socket.getnameinfo([nil, nil, nil, "210.163.138.100"]) => ["beryllium.ruby-lang.org", 0]
- Addrinfo#getnameinfo Addrinfo.ip("127.0.0.1").getnameinfo => ["localhost", "0"]
また、resolv ライブラリも使用できます。
クラス
Addrinfo | ソケットのアドレス情報を保持するクラスです。 |
Socket::AncillaryData | BasicSocket#sendmsg や BasicSocket#recvmsg で用いる ancillary data (補助データ、制御情報) を表すクラスです。 |
Socket::Option | BasicSocket#getsockopt、BasicSocket#setsockopt で使うソケットオプションの値を表すクラス。 |
Socket::UDPSource | Socket.udp_server_loop で使われるアドレス情報を保持するクラスです。 |
BasicSocket | ソケットを表す抽象クラスです。具体的なソケット操作はサブクラスで定義されます。 |
IPSocket | インターネットドメインソケットの抽象クラス。 |
TCPSocket | インターネットドメインのストリーム型ソケットのクラスです。 |
SOCKSSocket | TCPSocket を SOCKS(http://www.sw.nec.co.jp/middle/socks/) 対応したクラスです。 |
TCPServer | TCP/IP ストリーム型接続のサーバ側のソケットのクラスです。 |
UDPSocket | UDP/IPデータグラム型ソケットのクラス。 |
Socket | 汎用ソケットクラス。 |
UNIXSocket | UNIX ドメインのストリーム型ソケットのクラス。 |
UNIXServer | UNIXストリーム型接続のサーバ側のソケットのクラス。 |
Socket::Ifaddr | getifaddrs(3) の結果を表すクラスです。 |
モジュール
Socket::Constants | ソケット操作の指定のための定数を定義したモジュール。このモジュールをインクルードすれば、定数 (AF_INETなど) を直接参照できます。 |
例外クラス
SocketError | socket ライブラリに関する例外クラスです。 |