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

class UNIXServer

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

要約

UNIXストリーム型接続のサーバ側のソケットのクラス。

目次

特異メソッド
new open
インスタンスメソッド
accept accept_nonblock listen sysaccept

特異メソッド

open(path) -> UNIXServer[permalink][rdoc]
new(path) -> UNIXServer
open(path) {|sock| ...} -> object
new(path) {|sock| ...} -> object

path で指定したパス名を用いて接続を受け付けるソケット を作成します。

ブロックを省略すると作成したサーバソケットを返します。

ブロックを渡した場合は、作成したソケットを引数としてそのブロックを呼びだし、 ブロック終了時にソケットを閉じます。この場合には ブロックの評価値を返り値として返します。

[PARAM] path:
接続を受け付けるパス名文字列
require 'socket'

serv = UNIXServer.new("/tmp/sock")
s = serv.accept
p s.read

インスタンスメソッド

accept -> UnixSocket[permalink][rdoc]

クライアントからの接続要求を accept(2)で待ち受け、接続した UNIXSocket のインスタンスを返します。

例:

require 'socket'

UNIXServer.open("/tmp/s") {|serv|
  c = UNIXSocket.open("/tmp/s")
  s = serv.accept
  s.write "from server"
  c.write "from client"
  p c.recv(20)    #=> "from server"
  p s.recv(20)    #=> "from client"
}
accept_nonblock -> UnixSocket[permalink][rdoc]

ソケットをノンブロッキングモードに設定した後、 accept(2) を呼び出します。

接続した UNIXSocket のインスタンスを返します。

accept(2) がエラーになった場合、Socket#accept と同じ例外が 発生します。

Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO のいずれかの例外が 発生した場合は、その例外には IO::WaitReadable が extend されます。それを利用してリトライ可能な例外を掴まえることができます。

require 'socket'
serv = UNIXServer.new("/tmp/sock")
begin # emulate blocking accept
  sock = serv.accept_nonblock
rescue IO::WaitReadable, Errno::EINTR
  IO.select([serv])
  retry
end
# sock is an accepted socket.

[SEE_ALSO] UNIXServer#accept

listen(backlog) -> 0[permalink][rdoc]

listen(2) を実行します。 (Socket#listenと同じ)

backlog は、クライアントからの接続要求を保留できる数です。 UNIXServer のインスタンスは最初は backlog の値は 5 で生成されます。

listen(2) が成功すれば 0 を返します。 失敗すれば 例外 Errno::EXXX が発生します。

[PARAM] backlog:
バックログの最大数(接続要求を保留できる数)
sysaccept -> Integer[permalink][rdoc]

接続したクライアントのソケットをファイル記述子で返すことを除けば UNIXServer#accept と同じです。

例:

require 'socket'

UNIXServer.open("/tmp/s") {|serv|
  c = UNIXSocket.open("/tmp/s")
  p serv.sysaccept        #=> 6
}