class Redis::Connection::TCPSocket

def self.connect(host, port, timeout)

def self.connect(host, port, timeout)
  Timeout.timeout(timeout) do
    sock = new(host, port)
    sock
  end
rescue Timeout::Error
  raise TimeoutError
end

def self.connect(host, port, timeout)

def self.connect(host, port, timeout)
  # Limit lookup to IPv4, as Redis doesn't yet do IPv6...
  addr = ::Socket.getaddrinfo(host, nil, Socket::AF_INET)
  sock = new(::Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
  sockaddr = ::Socket.pack_sockaddr_in(port, addr[0][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