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
end
A 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
end
  Class 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.close
Internally, 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 1316
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);
}