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の時には,それ以降の送信,受信ともに拒否さ れます.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)

ソケットをhostportに結合します.

connect(host, port)

ソケットをhostportにconnectします.

recvfrom(len[, flags])

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

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

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


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)

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

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)

ホスト名またはIPアドレス(整数または"127.0.0.1" のような文字列)からホスト情報を返します.ホスト情報の構造は 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なソケットにおいてホストを指定する文字列は以下のいず れかの形式で指定します.