class Redis::Connection::TCPSocket

def self.connect_addrinfo(ai, port, timeout)

def self.connect_addrinfo(ai, port, timeout)
  sock = new(::Socket.const_get(ai[0]), Socket::SOCK_STREAM, 0)
  sockaddr = ::Socket.pack_sockaddr_in(port, ai[3])
  begin
    sock.connect_nonblock(sockaddr)
  rescue Errno::EINPROGRESS
    if IO.select(nil, [sock], nil, timeout) == nil
      raise TimeoutError
    end
    begin
      sock.connect_nonblock(sockaddr)
    rescue Errno::EISCONN
    end
  end
  sock
end