def connect(socket, host, port)
host = host[0, 0xFF]
socket << [VERSION, 0x01, 0x00, 0x03, host.size, host, port].pack("CCCCCA#{host.size}n")
version, status, _, type = socket.read(4).unpack("CCCC")
check_version(version)
case status
when 0x00
when 0x01
raise "general SOCKS server failure"
when 0x02
raise "connection not allowed by ruleset"
when 0x03
raise "network unreachable"
when 0x04
raise "host unreachable"
when 0x05
raise "connection refused"
when 0x06
raise "TTL expired"
when 0x07
raise "command not supported"
when 0x08
raise "address type not supported"
else
raise "unknown SOCKS error"
end
case type
when 0x01
destination = IPAddr.ntop(socket.read(4))
when 0x03
length = socket.read(1).unpack("C").first
destination = socket.read(length).unpack("A#{length}")
when 0x04
destination = IPAddr.ntop(socket.read(16))
else
raise "unsupported SOCKS5 address type"
end
port = socket.read(2).unpack("n").first
end