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

class TCPServer + TCPSocket

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

要約

TCP/IP ストリーム型接続のサーバ側のソケットのクラスです。

このクラスによって簡単にソケットを利用したサーバのプログラミングができます。

例えば echo サーバは以下のようになります。

require "socket"

gs = TCPServer.open(0)
socks = [gs]
addr = gs.addr
addr.shift
printf("server is on %s\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 %s\n", addr.join(":"))

while true
  Thread.start(gs.accept) do |s|       # save to dynamic variable
    print(s, " is accepted\n")
    while s.gets
      s.write($_)
    end
    print(s, " is gone\n")
    s.close
  end
end

特異メソッド

gethostbyname(host) -> Array

ホスト名または IP アドレス (整数または"127.0.0.1" のような文字列)からホストの情報を返します。ホスト情報は、ホ スト名、ホストの別名の配列、ホストのアドレスタイプ、ホストの アドレスを各要素とする配列です。ホストのアドレスは octet decimal の文字列 ("127.0.0.1"のような文字列) です。

[PARAM] host:
ホスト名または IP アドレス (整数または"127.0.0.1" のような文字列)を指定します。
[RETURN]
ホスト名、ホストの別名の配列、ホストのアドレスタイプ、ホストのアドレスを各要素とする配列を返します。

例:

p TCPSocket.gethostbyname("www.ruby-lang.org")
#=> ["beryllium.ruby-lang.org", [], 2, "210.163.138.100"]
new(host=nil, service) -> TCPServer
open(host=nil, service) -> TCPServer

新しいサーバー接続をオープンします。service は /etc/services (または NIS) に登録されているサービ ス名かポート番号で指定します。host を指定した時は 指定したホストに対しての接続だけを受け付けます。省略時は全てのホ スト(インタフェース)への接続要求を受け付けることになります。

host に指定できる形式はsocket/ホスト指定形式 を見てください。

[PARAM] host:
接続したいホストを指定します。 host に指定できる形式はsocket/ホスト指定形式 を見てください。
[PARAM] service:
/etc/services (または NIS) に登録されているサービ ス名かポート番号で指定します。
open(host, serv, local_host=nil, local_service=nil) -> TCPSocket [redefined by resolv-replace]
new(host, serv, local_host=nil, local_service=nil) -> TCPSocket [redefined by resolv-replace]

TCPSocket.new のパラメータ host と local_host の名前解決に resolv ライブラリを使います。

[PARAM] host:
ホスト名、または octet decimal によるインターネットアドレスを示す文字列を指定します。
[PARAM] service:
/etc/services (または NIS) に登録されているサービス名かポート番号を指定します。
[PARAM] local_host:
ホスト名、または octet decimal によるインターネットアドレスを示す文字列を指定します。
[PARAM] local_service:
/etc/services (または NIS) に登録されているサービス名かポート番号を指定します。
[EXCEPTION] SocketError:
名前解決に失敗した場合に発生します。
open(host, service, local_host=nil, local_service=nil) -> TCPSocket
new(host, service, local_host=nil, local_service=nil) -> TCPSocket

host で指定したホストの service で指定したポートと接続したソケッ トを返します。host はホスト名、または octet decimal によるインターネットアドレスを示す文字列、service は /etc/services (または NIS) に登録されているサー ビス名かポート番号です。

引数 local_host, local_service を指定した場合、そのアドレス に対して bind(2) します。

[PARAM] host:
ホスト名、または octet decimal によるインターネットアドレスを示す文字列を指定します。
[PARAM] service:
/etc/services (または NIS) に登録されているサービス名かポート番号を指定します。
[PARAM] local_host:
ホスト名、または octet decimal によるインターネットアドレスを示す文字列を指定します。
[PARAM] local_service:
/etc/services (または NIS) に登録されているサービス名かポート番号を指定します。

インスタンスメソッド

accept -> TCPSocket

クライアントからの接続要求を受け付け、接続した TCPSocket のインスタンスを返します。

例:

TCPServer.open("", 0) {|serv|
  c = TCPSocket.new(*serv.addr.values_at(3,1))
  s = serv.accept
  c.write "foo"
  p s.recv(10)  #=> "foo"
}
accept_nonblock -> TCPSocket

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

返り値は TCPServer#accept と同じです。

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

[EXCEPTION] Errno::EXXX:
accept(2) がエラーになった場合に発生します。
listen(backlog) -> 0

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

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

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

[PARAM] backlog:
backlog は、クライアントからの接続要求を保留できる数です。 TCPServer のインスタンスは最初は backlog の値は 5 で生成されます。
[EXCEPTION] Errno::EXXX:
listen(2) が失敗すれば 例外 Errno::EXXX が発生します。
[RETURN]
listen(2) が成功すれば 0 を返します。
sysaccept -> Fixnum

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

例:

TCPServer.open("", 0) {|serv|
  c = TCPSocket.new(*serv.addr.values_at(3,1))
  p serv.sysaccept        #=> 6
}
class TCPServer