Socket

# Socket::Constants

  ソケット操作の指定のための定数を定義したモジュール．このモジュー ルをインクルードすれば，定数(AF_INETなど)を直接参照できます．

# BasicSocket

  ソケットを表す抽象クラス。具体的なソケット操作はサブクラスで 定義されます。 例えばインターネットドメインストリームソケットの場合は `TCPSocket`を用います。

## スーパークラス:

  `IO`

## メソッド:

  `getsockname`

    ソケットの情報を取得します。sockaddr構造体をパックした 文字列を返します。`getsockname(2)`を参照のこと。

  `getsockopt(level, optname)`

    ソケットのオプションを取得します。`getsockopt(2)` を参照のこと。取得したオプションのデータをパックした文字列を 返します。

  `getpeername`

    接続の相手先のソケットの情報を取得します。sockaddr構造体をパッ クした文字列を返します。`getpeername(2)`を参照の こと。

  `recv(len[, flags])`

    ソケットからデータを受け取り，文字列として返します． lenは受け取る最大の長さを指定します． flagsについてはrecv(2)を参照．flagsの デフォルト値は0です．flagsの指定に必要な定数は Socketクラスで定義されています．(例: Socket::SO_LINGER)

  `send(mesg, flags[, to])`

    ソケットを介してデータを送ります．flagsに関しては `send(2)`を参照してください．`connect` していないソケットに対しては送り先であるtoを指定 する必要があります．実際に送ったデータの長さを返します．

  `setsockopt(level, optname, optval)`

    ソケットのオプションを設定します．`setsockopt(2)` を参照のこと．

  `shutdown([how])`

    ソケットの以降の接続を終了させます．howが0である 時，以降の受信が，1である時は，以降の送信が拒否されます． howが2の時には，それ以降の送信，受信ともに拒否さ れます．howを省略すると2を指定したことになります． `shutdown(2)`を参照．

# IPSocket

  インターネットドメインソケットのクラス．通常の `IO`クラスのサブクラスと同 様の入出力ができます．

## スーパークラス:

  `BasicSocket`

## クラスメソッド:

  `getaddress(host)`

    ホスト名からホストのアドレスを返します．ホストのアドレスは文 字列はoctet decimalの文字列(例:127.0.0.1)です．

## メソッド:

  `addr`

    ソケットの接続情報を表す配列を返します．配列の各要素は第1要 素が文字列 "AF_INET"，第2要素がport番号，第3要素がホストを表 す文字列，第4要素がホストのIPアドレスを表す文字列(octet decimal)です．

  `peeraddr`

    接続相手先ソケットの情報を表す配列を返します．配列の各要素は `addr`メソッドが返す配列 と同じです．

# TCPSocket

  インターネットドメインのストリーム型ソケットのクラス．通常の `IO`クラスのサブクラスと同 様の入出力ができます．このクラスによってソケットを用いたクラ イアントを簡単に記述できるようになります．ユーザの入力をその ままサーバに転送するプログラムは以下のようになります．

  >     require "socket"

  >     port = if ARGV.size > 0 then ARGV.shift else 4444 end
  >     print port, "\n"

  >     s = TCPSocket.open("localhost", port)

  >     while gets
  >       s.write($_)
  >       print(s.gets)
  >     end
  >     s.close

## スーパークラス:

  `IPSocket`

## クラスメソッド:

  `open(host, service)`
  `new(host, service)`

    hostで指定したホストのserviceで指定したポートと接続したソケッ トを返します．hostはホスト名，またはoctet decimal によるインターネットアドレスを示す文字列，service は`/etc/services`(またはNIS)に登録されているサー ビス名かポート番号です．

  `gethostbyname(host)`

    ホスト名またはIPアドレス(整数または`"127.0.0.1"` のような文字列)からホストの情報を返します．ホスト情報は，ホ スト名，ホストの別名の配列，ホストのアドレスタイプ，ホストの アドレスを各要素とする配列です．ホストのアドレスはoctet decimalの文字列(`"127.0.0.1"`のような文字列)です．

## メソッド:

  `recvfrom(len[, flags])`

    `recv`と同様にソケットからデータを受け取りますが， 戻り値は文字列と相手ソケットのアドレス(形式は IPSocket#addr参照)のペアです．引数につ いてはrecvと同様です．

# TCPServer

  TCP/IPストリーム型接続のサーバ側のソケットのクラス．このクラ スによって簡単にソケットを利用したサーバのプログラミングがで きます．例えばechoサーバは以下のようになります．

  >     require "socket"

  >     gs = TCPServer.open(0)
  >     socks = [gs]
  >     addr = gs.addr
  >     addr.shift
  >     printf("server is on %d\n", addr.join(":"))

  >     while TRUE
  >       nsock = select(socks)
  >       next if nsock == nil
  >       for s in nsock[0]
  >         if s == gs
  >           socks.push(s.accept)
  >           print(s, " is accepted\n")
  >         else
  >           if s.eof?
  >     	print(s, " is gone\n")
  >     	s.close
  >     	socks.delete(s)
  >           else
  >     	str = s.gets
  >     	s.write(str)
  >           end
  >         end
  >       end
  >     end

  `Thread`を使えばもっと短くなります．

  >     require "socket"

  >     gs = TCPServer.open(0)
  >     addr = gs.addr
  >     addr.shift
  >     printf("server is on %d\n", addr.join(":"))

  >     while TRUE
  >       ns = gs.accept
  >       print(ns, " is accepted\n")
  >       Thread.start do
  >         s =	ns			# save to dynamic variable
  >         while s.gets
  >           s.write($_)
  >         end
  >         print(s, " is gone\n")
  >         s.close
  >       end
  >     end

## スーパークラス:

  `TCPSocket`

## クラスメソッド:

  `new([host, ]service)`
  `open([host, ]service)`

    新しいサーバー接続をオープンします．serviceは `/etc/services`(またはNIS)に登録されているサービ ス名かポート番号で指定します．hostを指定した時は 指定したホストからの接続だけを受け付けます．省略時は全てのホ ストからの接続要求を受け付けることになります．

## メソッド:

  `accept`

    クライアントからの接続要求を受け付け，接続した `TCPSocket`のインスタンスを返します．

# UDPSocket

  UDP/IPデータグラム型ソケットのクラス．

## スーパークラス:

  `IPSocket`

## クラスメソッド:

  `open()`
  `new()`

    新しいUDPソケットを返します．

## メソッド:

  `bind(host, port)`

    ソケットをhostのportに結合します．

  `connect(host, port)`

    ソケットをhostのportにconnectします．

  `recvfrom(len[, flags])`

    `recv`と同様にソケットからデータを受け取りますが， 戻り値は文字列と相手ソケットのアドレス(形式は IPSocket#addr参照)のペアです．引数につ いてはrecvと同様です．

  `send(mesg, flags[, host, port])`

    ソケットを介してデータを送ります．flagsに関しては `send(2)`を参照してください．`connect` していないソケットに対しては送り先を指定するためhost とportを指定する必要があります．実際に送ったデー タの長さを返します．

# UNIXSocket

  UNIXドメインのストリーム型ソケットのクラス．通常の `IO`クラスのサブクラスと同様の 入出力ができます．

## スーパークラス:

  `BasicSocket`

## クラスメソッド:

  `open(path)`
  `new(path)`

    pathで指定したパス名を用いて接続したソケットを返 します．

## メソッド:

  `addr`

    ソケットの接続情報を表す配列を返します．配列の各要素は第1要 素が文字列 "AF_UNIX"，第2要素がパスを表す文字列です．

  `path`

    UNIXソケットのパスを返します．

  `peeraddr`

    接続相手先ソケットの情報を表す配列を返します．配列の各要素は `addr`メソッドが返す配列 と同じです．

  `recvfrom(len[, flags])`

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

# UNIXServer

  UNIXストリーム型接続のサーバ側のソケットのクラス．

## スーパークラス:

  `UNIXSocket`

## メソッド:

  `accept`

    クライアントからの接続要求を受け付け，接続した `UNIXSocket`のインスタンスを返します．

# Socket

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

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

## スーパークラス:

  `BasicSocket`

## クラスメソッド:

  `open(domain, type, protocol)`
  `new(domain, type, protocol)`

    新しいソケットを生成します．domain， type，protocolはインクルードファイルに ある定数で指定します．ほとんどの定数は`Socket`ク ラスでクラス定数として定義されています．domainと typeに関しては，文字列でも指定できますが，文字列 ですべてを機能を指定できる保証はありません．

  `for_fd(fd)`

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

  `pair(domain, type, protocol)`
  `socketpair(domain, type, protocol)`

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

  `gethostbyname(host)`

    ホスト名またはIPアドレス(整数または`"127.0.0.1"` のような文字列)からホストの情報を返します．ホスト情報は，ホ スト名，ホストの別名の配列，ホストのアドレスタイプ，ホストの アドレスを各要素とする配列です．ホストのアドレスはpackされた 文字列で，unpack("CCCC")で分解できます．

  `gethostbyaddr(host)`

    sockaddr構造体をパックした文字列からホスト情報を返します． ホスト情報の構造はgethostbynameと同じです．

  `getservbyname(service[, proto])`

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

## メソッド:

  `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と同様です．

## ホスト指定文字列

AF_INETなソケットにおいてホストを指定する文字列は以下のいず れかの形式で指定します．

- ホスト名
- octet decimalによるIPアドレス
- 空文字列 - `INADDR_ANY`に相当
- `"<broadcast>"` - `INADDR_BROADCAST`に相当