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, Qfalse, 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 1751
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); }