Class: TCPServer
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: | |
| Instance Chain: | |
| Inherits: | TCPSocket 
 | 
| Defined in: | ext/socket/tcpserver.c, ext/socket/socket.c, ext/socket/lib/socket.rb | 
Overview
TCPServer represents a TCP/IP server socket.
A simple TCP server may look like:
require 'socket'
server = TCPServer.new 2000 # Server bind to port 2000
loop do
  client = server.accept    # Wait for a client to connect
  client.puts "Hello !"
  client.puts "Time is #{Time.now}"
  client.close
endA more usable server (serving multiple clients):
require 'socket'
server = TCPServer.new 2000
loop do
  Thread.start(server.accept) do |client|
    client.puts "Hello !"
    client.puts "Time is #{Time.now}"
    client.close
  end
endClass Attribute Summary
::BasicSocket - Inherited
| .do_not_reverse_lookup | Gets the global do_not_reverse_lookup flag. | 
| .do_not_reverse_lookup= | Sets the global do_not_reverse_lookup flag. | 
Class Method Summary
- 
    
      .new([hostname,] port)  ⇒ TCPServer 
    
    constructor
    Creates a new server socket bound to port. 
::TCPSocket - Inherited
| .gethostbyname | Use Addrinfo.getaddrinfo instead. | 
| .new | Opens a TCP connection to  | 
::IPSocket - Inherited
| .getaddress | Lookups the IP address of host. | 
::BasicSocket - Inherited
| .for_fd | Returns a socket object which contains the file descriptor, fd. | 
Instance Attribute Summary
::BasicSocket - Inherited
| #do_not_reverse_lookup | Gets the do_not_reverse_lookup flag of basicsocket. | 
| #do_not_reverse_lookup= | Sets the do_not_reverse_lookup flag of basicsocket. | 
Instance Method Summary
- 
    
      #accept  ⇒ tcpsocket 
    
    Accepts an incoming connection. 
- 
    
      #accept_nonblock([options])  ⇒ tcpsocket 
    
    Accepts an incoming connection using accept(2) after O_NONBLOCK is set for the underlying file descriptor. 
- 
    
      #listen(int)  ⇒ 0 
    
    Alias for Socket#listen. 
- 
    
      #sysaccept  ⇒ file_descriptor 
    
    Returns a file descriptor of a accepted connection. 
- #__accept_nonblock(ex) private Internal use only
::IPSocket - Inherited
| #addr | Returns the local address as an array which contains address_family, port, hostname and numeric_address. | 
| #inspect | Return a string describing this  | 
| #peeraddr | Returns the remote address as an array which contains address_family, port, hostname and numeric_address. | 
| #recvfrom | Receives a message and return the message as a string and an address which the message come from. | 
::BasicSocket - Inherited
| #close_read | Disallows further read using shutdown system call. | 
| #close_write | Disallows further write using shutdown system call. | 
| #connect_address | Returns an address of the socket suitable for connect in the local machine. | 
| #getpeereid | Returns the user and group on the peer of the UNIX socket. | 
| #getpeername | Returns the remote address of the socket as a sockaddr string. | 
| #getsockname | Returns the local address of the socket as a sockaddr string. | 
| #getsockopt | Gets a socket option. | 
| #local_address | Returns an  | 
| #recv | Receives a message. | 
| #recv_nonblock | Receives up to maxlen bytes from  | 
| #recvmsg | recvmsg receives a message using recvmsg(2) system call in blocking manner. | 
| #recvmsg_nonblock | recvmsg receives a message using recvmsg(2) system call in non-blocking manner. | 
| #remote_address | Returns an  | 
| #send | send mesg via basicsocket. | 
| #sendmsg | sendmsg sends a message using sendmsg(2) system call in blocking manner. | 
| #sendmsg_nonblock | sendmsg_nonblock sends a message using sendmsg(2) system call in non-blocking manner. | 
| #setsockopt | Sets a socket option. | 
| #shutdown | Calls shutdown(2) system call. | 
| #__recvmsg, #__recvmsg_nonblock, #__sendmsg, #__sendmsg_nonblock, #read_nonblock, #write_nonblock, #__read_nonblock, #__recv_nonblock, #__write_nonblock | |
Constructor Details
    .new([hostname,] port)  ⇒ TCPServer   
Creates a new server socket bound to port.
If hostname is given, the socket is bound to it.
serv = TCPServer.new("127.0.0.1", 28561)
s = serv.accept
s.puts Time.now
s.closeInternally, new calls getaddrinfo() function to obtain addresses. If getaddrinfo() returns multiple addresses, new tries to create a server socket for each address and returns first one that is successful.
# File 'ext/socket/tcpserver.c', line 33
static VALUE
tcp_svr_init(int argc, VALUE *argv, VALUE sock)
{
    VALUE hostname, port;
    rb_scan_args(argc, argv, "011", &hostname, &port);
    return rsock_init_inetsock(sock, hostname, port, Qnil, Qnil, INET_SERVER, Qnil, Qnil);
}
  Instance Method Details
#__accept_nonblock(ex) (private)
# File 'ext/socket/tcpserver.c', line 65
static VALUE
tcp_accept_nonblock(VALUE sock, VALUE ex)
{
    rb_io_t *fptr;
    union_sockaddr from;
    socklen_t len = (socklen_t)sizeof(from);
    GetOpenFile(sock, fptr);
    return rsock_s_accept_nonblock(rb_cTCPSocket, ex, fptr, &from.addr, &len);
}
  
    #accept  ⇒ tcpsocket   
Accepts an incoming connection. It returns a new ::TCPSocket object.
TCPServer.open("127.0.0.1", 14641) {|serv|
  s = serv.accept
  s.puts Time.now
  s.close
}# File 'ext/socket/tcpserver.c', line 55
static VALUE
tcp_accept(VALUE server)
{
    union_sockaddr buffer;
    socklen_t length = sizeof(buffer);
    return rsock_s_accept(rb_cTCPSocket, server, &buffer.addr, &length);
}
  
    #accept_nonblock([options])  ⇒ tcpsocket   
Accepts an incoming connection using accept(2) after O_NONBLOCK is set for the underlying file descriptor. It returns an accepted ::TCPSocket for the incoming connection.
Example
require 'socket'
serv = TCPServer.new(2202)
begin # emulate blocking accept
  sock = serv.accept_nonblock
rescue IO::WaitReadable, Errno::EINTR
  IO.select([serv])
  retry
end
# sock is an accepted socket.Refer to Socket#accept for the exceptions that may be thrown if the call to accept_nonblock fails.
accept_nonblock may raise any error corresponding to accept(2) failure, including Errno::EWOULDBLOCK.
If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO, it is extended by IO::WaitReadable. So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
By specifying a keyword argument exception to false, you can indicate that accept_nonblock should not raise an IO::WaitReadable exception, but return the symbol :wait_readable instead.
See
# File 'ext/socket/lib/socket.rb', line 1319
def accept_nonblock(exception: true) __accept_nonblock(exception) end
    #listen(int)  ⇒ 0   
Alias for Socket#listen.
    #sysaccept  ⇒ file_descriptor   
Returns a file descriptor of a accepted connection.
TCPServer.open("127.0.0.1", 28561) {|serv|
  fd = serv.sysaccept
  s = IO.for_fd(fd)
  s.puts Time.now
  s.close
}# File 'ext/socket/tcpserver.c', line 90
static VALUE
tcp_sysaccept(VALUE server)
{
    union_sockaddr buffer;
    socklen_t length = sizeof(buffer);
    return rsock_s_accept(0, server, &buffer.addr, &length);
}