ソケット操作の指定のための定数を定義したモジュール.このモジュー ルをインクルードすれば,定数(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)に登録されているサー ビス名かポート番号です.
gethostbyname(host)
ホスト名またはIPアドレス(整数または"127.0.0.1"
のような文字列)からホストの情報を返します.ホスト情報は,ホ
スト名,ホストの別名の配列,ホストのアドレスタイプ,ホストの
アドレスを各要素とする配列です.ホストのアドレスはoctet
decimalの文字列("127.0.0.1"
のような文字列)です.
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
と同様にソケットからデータを受け取りますが,
戻り値は文字列と相手ソケットのアドレス(形式は
IPSocket#addr参照)のペアです.引数につ
いては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された文字 列で指定します.
一般的なソケットプログラミングはより高レベルの
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)
ホスト名または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
に相当