def _connect(host, port, timeout)
error = nil
sock = nil
begin
addrinfo = Socket.getaddrinfo(host, port, Socket::AF_UNSPEC, Socket::SOCK_STREAM)
rescue SocketError => se
raise se.message
end
addrinfo.each do |_, port, name, addr, af|
begin
sockaddr = Socket.pack_sockaddr_in(port, addr)
sock = _connect_sockaddr(af, sockaddr, timeout)
rescue => aux
case aux
when Errno::EAFNOSUPPORT, Errno::ECONNREFUSED
error = aux
next
else
raise
end
else
break
end
end
unless sock
raise error if error
raise
end
sock
end