names=tcp_server_sockets
visibility=public
kind=defined

--- tcp_server_sockets(port) -> [Socket]
--- tcp_server_sockets(host, port) -> [Socket]
--- tcp_server_sockets(port){|sockets| ...}  -> object
--- tcp_server_sockets(host, port){|sockets| ...}  -> object

TCP/IP で host:port で待ち受けるサーバ側のソケットを
作成します。

ブロックなしの場合は、ソケットオブジェクトの配列を返します。

ブロック付きの場合は、ソケットオブジェクトをそのブロックに
渡して呼び出します。ブロック終了時にそれらのソケットを閉じます。
返り値はブロックの評価値となります。

port が 0 の場合は、実際のポート番号は動的に選ばれます。
ただし返り値のソケットはすべて同じ番号を持ちます。

  # tcp_server_sockets returns は2つのソケットを返す
  sockets = Socket.tcp_server_sockets(1296)
  p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
  
  # それぞれは IPv4 と IPv6 のソケット
  sockets.each {|s| p s.local_address }
  #=> #<Addrinfo: [::]:1296 TCP>
  #   #<Addrinfo: 0.0.0.0:1296 TCP>
  
  # ポート番号を動的に選んでも IPv6 と IPv4 で同じポート番号を持つ
  sockets = Socket.tcp_server_sockets(0)
  sockets.each {|s| p s.local_address }
  #=> #<Addrinfo: [::]:53114 TCP>
  #   #<Addrinfo: 0.0.0.0:53114 TCP>
  
  # ブロックにソケットの配列が渡される
  Socket.tcp_server_sockets(0) {|sockets|
    p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
  }


@param host 割り当てるホスト名
@param port 割り当てるポート番号
@see [[m:Socket.tcp_server_loop]]

