ソケット操作の指定のための定数を定義したモジュール.このモジュー ルをインクルードすれば,定数(AF_INETなど)を直接参照できます.
ソケットを表す抽象クラス。具体的なソケット操作はサブクラスで
定義されます。
例えばインターネットドメインストリームソケットの場合は
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)を参照.
インターネットドメインソケットのクラス.通常の
IOクラスのサブクラスと同
様の入出力ができます.
BasicSocket
getaddress(host)
ホスト名からホストのアドレスを返します.ホストのアドレスは文 字列はoctet decimalの文字列(例:127.0.0.1)です.
addr
ソケットの接続情報を表す配列を返します.配列の各要素は第1要 素が文字列 "AF_INET",第2要素がport番号,第3要素がホストを表 す文字列,第4要素がホストのIPアドレスを表す文字列(octet decimal)です.
peeraddr
接続相手先ソケットの情報を表す配列を返します.配列の各要素は
addrメソッドが返す配列
と同じです.
インターネットドメインのストリーム型ソケットのクラス.通常の
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)に登録されているサー ビス名かポート番号です.
recvfrom(len[, flags])
recvと同様にソケットからデータを受け取りますが,
戻り値は文字列と相手ソケットのアドレス(形式は
IPsocket#addr参照)のペアです.引数につ
いてはrecvと同様です.
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のインスタンスを返します.
UDP/IPデータグラム型ソケットのクラス.
IPsocket
open()
new()
新しいUDPソケットを返します.
bind(host, port)
ソケットをhostのportに結合します.
connect(host, port)
ソケットをhostのportにconnectします.
recvfrom(len[, flags])
recvと同様にソケットからデータを受け取りますが,
戻り値は文字列と相手ソケットのアドレス(形式は[host, port]の
配列)のペアです.引数についてはrecvと同様です.
send(mesg, flags[, host, port])
ソケットを介してデータを送ります.flagsに関しては
send(2)を参照してください.connect
していないソケットに対しては送り先を指定するためhost
とportを指定する必要があります.実際に送ったデー
タの長さを返します.
UNIXドメインのストリーム型ソケットのクラス.通常の
IOクラスのサブクラスと同様の
入出力ができます.
BasicSocket
open(path)
new(path)
pathで指定したパス名を用いて接続したソケットを返 します.
addr
ソケットの接続情報を表す配列を返します.配列の各要素は第1要 素が文字列 "AF_UNIX",第2要素がパスを表す文字列です.
path
UNIXソケットのパスを返します.
peeraddr
接続相手先ソケットの情報を表す配列を返します.配列の各要素は
addrメソッドが返す配列
と同じです.
recvfrom(len[, flags])
recvと同様にソケットからデータを受け取りますが,
戻り値は文字列と相手ソケットのパスのペアです.引数につい
てはrecvと同様です.
UNIXストリーム型接続のサーバ側のソケットのクラス.
UNIXsocket
accept
クライアントからの接続要求を受け付け,接続した
UNIXsocketのインスタンスを返します.
ソケットそのものに対するシステムコールレベルのアクセスを提供 するクラス.Perlのソケットに対するアクセスと同レベルの機能を 提供してます.このクラスではソケットアドレスはpackされた文字 列で指定します.
一般的なソケットプログラミングはより高レベルの
TCPsocetクラスや
TCPserverクラスを用い
て行われることが多く,このクラスはあまり用いられません.
BasicSocket
open(domain, type, protocol)
new(domain, type, protocol)
新しいソケットを生成します.domain,
type,protocolはインクルードファイルに
ある定数で指定します.ほとんどの定数はSocketク
ラスでクラス定数として定義されています.domainと
typeに関しては,文字列でも指定できますが,文字列
ですべてを機能を指定できる保証はありません.
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なソケットにおいてホストを指定する文字列は以下のいず れかの形式で指定します.
INADDR_ANYに相当
"<broadcast>" - INADDR_BROADCASTに相当