TCPTimeout
A wrapper around Ruby Sockets providing timeouts for connect, write, and read
operations using Socket#*_nonblock
methods and IO.select
instead of
Timeout.timeout
.
Usage
gem install tcp_timeout
Pass one or more of :connect_timeout
, :write_timeout
, and :read_timeout
as options to TCPTimeout::TCPSocket.new. If a timeout is omitted or nil, that
operation will behave as a normal Socket would. On timeout, a
TCPTimeout::SocketTimeout
(subclass of SocketError
) will be raised.
When calling #read
with a byte length it is possible for it to read some data
before timing out. If you need to avoid losing this data you can pass a buffer
string which will receive the data even after a timeout.
Other options:
:family
- set the address family for the connection, e.g. :INET
or :INET6
:local_host
and :local_port
- the host and port to bind to
TCPTimeout::TCPSocket supports only a subset of IO methods, including:
close closed? read read_nonblock readbyte readpartial write write_nonblock
Example:
begin
sock = TCPTimeout::TCPSocket.new(host, port, connect_timeout: 10, write_timeout: 9)
sock.write('data')
sock.close
rescue TCPTimeout::SocketTimeout
puts "Operation timed out!"
end