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.:INETor:INET6 -
:local_hostand: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