Maintenance Ruby 3.4 gets fixes, but no new features. Switch to Ruby 4.0 →
Socket.tcp
# File tmp/rubies/ruby-3.4.1/ext/socket/lib/socket.rb, line 659
def self.tcp(host, port, local_host = nil, local_port = nil, connect_timeout: nil, resolv_timeout: nil, fast_fallback: tcp_fast_fallback, &) # :yield: socket
sock = if fast_fallback && !(host && ip_address?(host))
tcp_with_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:)
else
tcp_without_fast_fallback(host, port, local_host, local_port, connect_timeout:, resolv_timeout:)
end
if block_given?
begin
yield sock
ensure
sock.close
end
else
sock
end
end
creates a new socket object connected to host:port using TCP/IP.
Starting from Ruby 3.4, this method operates according to the Happy Eyeballs Version 2 (RFC 8305) algorithm by default.
For details on Happy Eyeballs Version 2, see Socket.tcp_fast_fallback=.
To make it behave the same as in Ruby 3.3 and earlier, explicitly specify the option fast_fallback:false. Or, setting Socket.tcp_fast_fallback=false will disable Happy Eyeballs Version 2 not only for this method but for all Socket globally.
If local_host:local_port is given, the socket is bound to it.
The optional last argument opts is options represented by a hash. opts may have following options:
- :resolv_timeout
-
Specifies the timeout in seconds from when the hostname resolution starts.
- :connect_timeout
-
This method sequentially attempts connecting to all candidate destination addresses.
Theconnect_timeoutspecifies the timeout in seconds from the start of the connection attempt to the last candidate.
By default, all connection attempts continue until the timeout occurs.
Whenfast_fallback:falseis explicitly specified,
a timeout is set for each connection attempt and any connection attempt that exceeds its timeout will be canceled. - :fast_fallback
-
Enables the Happy Eyeballs Version 2 algorithm (enabled by default).
If a block is given, the block is called with the socket. The value of the block is returned. The socket is closed when this method returns.
If no block is given, the socket is returned.
Socket.tcp("www.ruby-lang.org", 80) {|sock| sock.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n" sock.close_write puts sock.read }