Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > socketライブラリ > BasicSocketクラス

class BasicSocket

クラスの継承リスト: BasicSocket < IO < Enumerable < File::Constants < Object < Kernel

要約

ソケットを表す抽象クラスです。具体的なソケット操作はサブクラスで 定義されます。

例えばインターネットドメインストリームソケットの場合は TCPSocket を用います。

目次

特異メソッド
do_not_reverse_lookup do_not_reverse_lookup= for_fd
インスタンスメソッド
getpeername getsockname getsockopt recv recv_nonblock send setsockopt shutdown

特異メソッド

do_not_reverse_lookup -> bool[permalink][rdoc]

この値が真ならアドレスからホスト名への逆引きを行わなくなります。

この設定は大域的に作用します。

デフォルトは false です。

以下のメソッドの動作に影響します。

do_not_reverse_lookup=(bool)[permalink][rdoc]

BasicSocket#do_not_reverse_lookup の値を変更します。

[PARAM] bool:
この値が真ならアドレスからホスト名への逆引きを行わなくなります。

例:

require 'socket'

p TCPSocket.new('localhost', 'telnet').addr
TCPSocket.do_not_reverse_lookup = true
p TCPSocket.new('localhost', 'telnet').addr

=> ["AF_INET", 2253, "localhost", "127.0.0.1"]
   ["AF_INET", 2254, "127.0.0.1", "127.0.0.1"]
for_fd(fd) -> BasicSocket[permalink][rdoc]

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

返り値のクラスはどのクラスの for_fd を呼びだしたかによって決まります。

BasicSocket.for_fd(fd) # BasicSocket のインスタンスを返す
TCPSocket.for_fd(fd) # TCPSocket のインスタンスを返す
[PARAM] fd:
ファイルディスクリプタ を指定します。
[RETURN]
任意のソケットである fd から対応するソケットクラスのインスタンスを作り、それを返します。

インスタンスメソッド

getpeername -> String[permalink][rdoc]

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

例:

serv = TCPServer.open("", 0)
c = TCPSocket.open(*Socket.unpack_sockaddr_in(serv.getsockname).reverse)
s = serv.accept
addr = c.getpeername
p addr      #=> "\002\000\267\214\177\000\000\001\000\000\000\000\000\000\000\000"
p Socket.unpack_sockaddr_in(addr)   #=> [46988, "127.0.0.1"]
p addr == s.getsockname     #=> true
getsockname -> String[permalink][rdoc]

ソケットの情報を取得します。sockaddr 構造体をパックした 文字列を返します。getsockname(2) を参照してください。

例:

serv = TCPServer.open("", 0)
p serv.getsockname        #=> "\002\000\236C\000\000\000\000\000\000\000\000\000\000\000\000"
p Socket.unpack_sockaddr_in(serv.getsockname)     #=> [40515, "0.0.0.0"]
c = TCPSocket.open(*Socket.unpack_sockaddr_in(serv.getsockname).reverse)
s = serv.accept
getsockopt(level, optname) -> String[permalink][rdoc]

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

[PARAM] level:
getsockopt(2) の 第二引数のlevel
[PARAM] optname:
getsockopt(2) の 第三引数のoption_name

[SEE_ALSO] BasicSocket#setsockopt

例:

serv = TCPServer.open("", 0)
c = TCPSocket.open(*Socket.unpack_sockaddr_in(serv.getsockname).reverse)
s = serv.accept
opt = c.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY)
p opt #=> "\000\000\000\000"
p opt.unpack("i")[0] #=> 0   (Nagle アルゴリズム有効)
recv(maxlen, flags = 0) -> String[permalink][rdoc]

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

内部で呼び出す recv(2) が 0 を返した場合、このメソッドは "" を返します。 この意味はソケットによって異なります。 たとえば TCP では EOF を意味しますし、 UDP では空のパケットを読み込んだことを意味します。

[PARAM] maxlen:
受け取る文字列の最大の長さを指定します。
[PARAM] flags:
recv(2) を参照してください。
[EXCEPTION] IOError:
[EXCEPTION] Errno::EXXX:
recvfrom(2) がエラーになった場合などに発生します。

例:

s1, s2 = UNIXSocket.pair
s1.write "a"
s1.close
p s2.recv(10, Socket::MSG_PEEK)   #=> "a"
p s2.recv(10)                     #=> "a"
p s2.recv(10)                     #=> ""
recv_nonblock(maxlen, flags = 0) -> String[permalink][rdoc]

ソケットをノンブロッキングモードに設定した後、 recvfrom(2) でソケットからデータを受け取ります。

引数、返り値は BasicSocket#recv と同じです。

recvfrom(2) がエラーになった場合、 EAGAIN, EINTR を含め例外 Errno::EXXX が発生します。

[PARAM] maxlen:
受け取る文字列の最大の長さを指定します。
[PARAM] flags:
recv(2) を参照してください。
[EXCEPTION] IOError:
[EXCEPTION] Errno::EXXX:
recvfrom(2) がエラーになった場合などに発生します。
send(mesg, flags, dest_sockaddr = nil) -> Fixnum[permalink][rdoc]

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

dest_sockaddr には「ソケットアドレス構造体を pack した文字列」 を指定します。

データの送信に失敗した場合は例外 Errno::EXXX が発生します。

[PARAM] mesg:
送信するデータを文字列で指定します。
[PARAM] flags:
send(2) の flags を参照してください。
[PARAM] dest_sockaddr:
「ソケットアドレス構造体を pack した文字列」を指定します。
[EXCEPTION] Errno::EXXX:
データの送信に失敗した場合に発生します。

例:

s = UDPSocket.new
sockaddr = Socket.sockaddr_in("discard", "localhost")
s.send("The king has donkey ears!", 0, sockaddr)
setsockopt(level, optname, optval) -> 0[permalink][rdoc]

ソケットのオプションを設定します。setsockopt(2) を参照してください。

level, optname には Socket::SOL_SOCKET や Socket::SO_REUSEADDR といった整数値を用います。

optval には文字列、整数、真偽値(true or false)を渡すことができます。 文字列の場合には setsockopt(2) にはその文字列と 長さが渡されます。整数の場合はintへのポインタが渡されます。 true/falseの場合は0/1という整数と解釈され、そのメモリ領域の intポインタを渡します。

[PARAM] level:
setsockopt(2) の level を参照してください。
[PARAM] optname:
setsockopt(2) の option_name を参照してください。
[PARAM] optval:
設定値
[EXCEPTION] Errno::EXXX:
オプションの設定に失敗した場合発生します。

[SEE_ALSO] BasicSocket#getsockopt

shutdown(how = Socket::SHUT_RDWR) -> 0[permalink][rdoc]

ソケットの以降の接続を終了させます。

how の値によって以下のように接続が終了します。

how を省略すると Socket::SHUT_RDWR を指定したことになります。 shutdown(2) を参照してください。

[PARAM] how:
接続の終了の仕方を Socket::SHUT_RD, Socket::SHUT_WR, Socket::SHUT_RDWR などで指定します。
[EXCEPTION] Errno::EXXX:
ソケットの以降の接続を終了操作が失敗した場合に発生します。
[EXCEPTION] ArgumentError:
how に範囲外の整数を入力した場合に発生します。
[EXCEPTION] SecurityError:
セーフレベルが 4 以上で、ソケットに汚染マークがついていない場合発生します。