Ruby 2.0.0 リファレンスマニュアル > ライブラリ一覧 > socketライブラリ > BasicSocketクラス
クラスの継承リスト: BasicSocket < IO < Enumerable < File::Constants < Object < Kernel < BasicObject
ソケットを表す抽象クラスです。具体的なソケット操作はサブクラスで 定義されます。
例えばインターネットドメインストリームソケットの場合は TCPSocket を用います。
do_not_reverse_lookup -> bool[permalink][rdoc]Socket#do_not_reverse_lookup の Socket オブジェクト生成時の デフォルト値を返します。
この設定は大域的に作用します。
デフォルトは true です。
do_not_reverse_lookup=(bool)[permalink][rdoc]BasicSocket#do_not_reverse_lookup の値を変更します。
例:
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 のインスタンスを返す
connect_address -> Addrinfo[permalink][rdoc]ローカルマシン内で接続するのに適当なアドレスを Addrinfo オブジェクトで返します。
BasicSocket#local_address の返り値 以下の点を除いては同じものを返します。
BasicSocket#local_address が接続先として不適なアドレスを返す場合は 例外 SocketError が発生します。
Addrinfo.tcp("0.0.0.0", 0).listen {|serv|
p serv.connect_address #=> #<Addrinfo: 127.0.0.1:53660 TCP>
serv.connect_address.connect {|c|
s, _ = serv.accept
p [c, s] #=> [#<Socket:fd 4>, #<Socket:fd 6>]
}
}
[SEE_ALSO] BasicSocket#local_address
do_not_reverse_lookup -> bool[permalink][rdoc]ソケットごとのアドレスからホスト名への逆引きの設定を返します。
真ならアドレスからホスト名への逆引きを行いません。
初期値はソケットを生成したときの BasicSocket.do_not_reverse_lookup の値になります。
[SEE_ALSO] BasicSocket#do_not_reverse_lookup=
do_not_reverse_lookup=(bool)[permalink][rdoc]アドレスからホスト名への逆引きの設定をソケットごとに設定します。
[SEE_ALSO] BasicSocket#do_not_reverse_lookup
getpeereid -> [Integer, Integer][permalink][rdoc]Unix ドメインソケットにおいて接続相手の euid と egid を 返します。
配列の最初の要素が euid, 2番目の要素が egid です。
ソケットが Unix ドメインソケットでない場合の返り値は 不定です。
Socket.unix_server_loop("/tmp/sock") {|s|
begin
euid, egid = s.getpeereid
# Check the connected client is myself or not.
next if euid != Process.uid
# do something about my resource.
ensure
s.close
end
}
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) -> Socket::Option[permalink][rdoc]ソケットのオプションを取得します。getsockopt(2) を参照してください。 取得したオプションのデータを Socket::Option で返します。
level, optname には Socket::SOL_SOCKET や Socket::SO_REUSEADDR といった整数値の他、文字列("SOL_SOCKET", prefixなしの "SOCKET")や シンボル(:SO_REUSEADDR, :REUSEADDR)を用いることができます。
[SEE_ALSO] BasicSocket#setsockopt
例:
serv = Socket.tcp_server_sockets("", 0)[0]
c = serv.local_address.connect
s = serv.accept
opt = c.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY)
# c.getsockopt("TCP", "NODELAY"), なども可能
p opt #=> #<Socket::Option: INET TCP NODELAY 0>
p opt.bool #=> false (Nagle アルゴリズム有効)
p opt.unpack("i")[0] #=> 0 (Socket::Option#unpack が互換性のために存在する)
# 整数値の場合は Socket::Option#int を用いる
p c.getsockopt(:IP, :TTL).int #=> 64
local_address -> Addrinfo[permalink][rdoc]getsockname(2) で得られたローカルアドレス情報を Addrinfo オブジェクトとして返します。
返されたオブジェクトの Addrinfo#protocol は 0 を 返すことに注意してください。
TCPSocket.open("www.ruby-lang.org", 80) {|s|
p s.local_address #=> #<Addrinfo: 192.168.0.129:36873 TCP>
}
TCPServer.open("127.0.0.1", 1512) {|serv|
p serv.local_address #=> #<Addrinfo: 127.0.0.1:1512 TCP>
}
[SEE_ALSO] BasicSocket#getsockname
recv(maxlen, flags = 0) -> String[permalink][rdoc]ソケットからデータを受け取り、文字列として返します。 maxlen は受け取る最大の長さを指定します。 flags については recv(2) を参照してください。flags の デフォルト値は 0 です。flags の指定に必要な定数は Socket クラスで定義されています。(例: Socket::MSG_PEEK)
内部で呼び出す recv(2) が 0 を返した場合、このメソッドは "" を返します。 この意味はソケットによって異なります。 たとえば TCP では EOF を意味しますし、 UDP では空のパケットを読み込んだことを意味します。
例:
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 が発生します。
recvmsg(maxmesglen=nil, flags=0, maxcontrollen=nil, opts={}) -> [String, Addrinfo, Integer, *Socket::AncillaryData][permalink][rdoc]recvmsg(2) を用いてメッセージを受け取ります。
このメソッドはブロックします。ノンブロッキング方式で通信したい 場合は BasicSocket#recvmsg_nonblock を用います。
maxmesglen, maxcontrollen で受け取るメッセージおよび補助データ (Socket::AncillaryData)の最大長をバイト単位で指定します。 省略した場合は必要なだけ内部バッファを拡大して データが切れないようにします。
flags では Socket::MSG_* という名前の定数の biwsise OR を取った ものを渡します。
opts にはその他のオプションを渡します。今のところ :scm_right => bool というオプションのみ利用できます。このオプションに 真を渡すと、 SCM_RIGHTS 制御メッセージを受け取ったときに、メッセージに含まれる IO オブジェクトを生成します。詳しくは Socket::AncillaryData#unix_rights を参照してください。
返り値は配列で得られます。
返り値の配列の最初の要素は受け取ったメッセージを表す文字列です。
2番目の要素は connection-less socket の場合には送り元の アドレスが Addrinfo オブジェクトとして含まれています。 TCP のような connection-oriented socket の場合は 何が含まれているかはプラットフォーム依存です。
3番目の要素は受け取ったメッセージに付加されているフラグで、 Socket::MSG_* 定数の bitwise OR で表現されています。
残りの要素は補助データ(Socket::AncillaryData オブジェクト)です。
# UnixSocket#recv_io を recvmsg で実装する例
mesg, sender_sockaddr, rflags, *controls = sock.recvmsg(:scm_rights=>true)
controls.each {|ancdata|
if ancdata.cmsg_is?(:SOCKET, :RIGHTS)
return ancdata.unix_rights[0]
end
}
recvmsg_nonblock(maxmesglen=nil, flags=0, maxcontrollen=nil, opts={}) -> [String, Addrinfo, Integer, *Socket::AncillaryData][permalink][rdoc]recvmsg(2) を用いてノンブロッキング方式でメッセージを受け取ります。
ブロッキングの有無以外は BasicSocket#recvmsg と同じです。 詳しくはそちらを参照してください。
remote_address -> Addrinfo[permalink][rdoc]getpeername(2) で得られたリモートアドレス情報を Addrinfo オブジェクトとして返します。
返されたオブジェクトの Addrinfo#protocol は 0 を 返すことに注意してください。
TCPSocket.open("www.ruby-lang.org", 80) {|s|
p s.remote_address #=> #<Addrinfo: 221.186.184.68:80 TCP>
}
TCPServer.open("127.0.0.1", 1728) {|serv|
c = TCPSocket.new("127.0.0.1", 1728)
s = serv.accept
p s.remote_address #=> #<Addrinfo: 127.0.0.1:36504 TCP>
}
[SEE_ALSO] BasicSocket#getpeername
send(mesg, flags, dest_sockaddr = nil) -> Fixnum[permalink][rdoc]ソケットを介してデータを送ります。flags に関しては send(2) を参照してください。connect していないソケット に対しては送り先である dest_sockaddr を指定する必要があります。実際に送っ たデータの長さを返します。
dest_sockaddr には「ソケットアドレス構造体を pack した文字列」 を指定します。
データの送信に失敗した場合は例外 Errno::EXXX が発生します。
例:
s = UDPSocket.new
sockaddr = Socket.sockaddr_in("discard", "localhost")
s.send("The king has donkey ears!", 0, sockaddr)
sendmsg(mesg, flags=0, dest_sockaddr=nil, *controls) -> Integer[permalink][rdoc]sendmsg(2) を用いてメッセージを送ります。
このメソッドはブロックします。ノンブロッキング方式で通信したい 場合は BasicSocket#sendmsg_nonblock を用います。
ソケットが connection-less の場合は dest_sockaddr で 通信先のアドレスを指定しなければなりません。Socket.sockaddr_in の返り値や Addrinfo オブジェクトを引数として渡すことができます。
controls には 補助データ(ancillary data)を渡します。 Socket::AncillaryData のインスタンスや 3要素(cmsg_level, cmsg_type, cmsg_data) の配列を用いることができます。
送ったバイト数を返します。
# UnixSocket#send_io の実装例
# use Socket::AncillaryData.
ancdata = Socket::AncillaryData.int(:UNIX, :SOCKET, :RIGHTS, io.fileno)
sock.sendmsg("a", 0, nil, ancdata)
# use 3-element array.
ancdata = [:SOCKET, :RIGHTS, [io.fileno].pack("i!")]
sock.sendmsg("\0", 0, nil, ancdata)
[SEE_ALSO] BasicSocket#sendmsg_nonblock
sendmsg_nonblock(mesg, flags=0, dest_sockaddr=nil, *controls) -> Integer[permalink][rdoc]sendmsg(2) を用いてノンブロッキング方式でメッセージを送ります。
詳しくは BasicSocket#sendmsg を見てください。
[SEE_ALSO] BasicSocket#sendmsg
setsockopt(level, optname, optval) -> 0[permalink][rdoc]setsockopt(socketoption) -> 0ソケットのオプションを設定します。setsockopt(2) を参照してください。
level, optname には Socket::SOL_SOCKET や Socket::SO_REUSEADDR といった整数値の他、文字列("SOL_SOCKET", prefixなしの "SOCKET")や シンボル(:SO_REUSEADDR, :REUSEADDR)を用いることができます。
optval には文字列、整数、真偽値(true or false)を渡すことができます。 文字列の場合には setsockopt(2) にはその文字列と 長さが渡されます。整数の場合はintへのポインタが渡されます。 true/falseの場合は0/1という整数と解釈され、そのメモリ領域の intポインタを渡します。
引数が1つの場合は Socket::Option で設定値を表現します。
# 真偽値の場合
#setsockopt could be called like this:
sock.setsockopt(:SOCKET, :REUSEADDR, true)
sock.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
sock.setsockopt(Socket::Option.bool(:INET, :SOCKET, :REUSEADDR, true))
# 整数値の場合
#setsockopt could be called like this:
sock.setsockopt(:IP, :TTL, 255)
sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, 255)
sock.setsockopt(Socket::Option.int(:INET, :IP, :TTL, 255))
# より複雑な場合
optval = IPAddr.new("224.0.0.251").hton +
IPAddr.new(Socket::INADDR_ANY, Socket::AF_INET).hton
sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, optval)
[SEE_ALSO] BasicSocket#getsockopt
shutdown(how = Socket::SHUT_RDWR) -> 0[permalink][rdoc]ソケットの以降の接続を終了させます。
how の値によって以下のように接続が終了します。
how を省略すると Socket::SHUT_RDWR を指定したことになります。 shutdown(2) を参照してください。