def _write_socks5_address(self, addr):
host, port = addr
proxy_type, rdns, _, _, username, password = self.proxy_settings
family_to_byte = {socket.AF_INET: b"\x01", socket.AF_INET6: b"\x04"}
for family in (socket.AF_INET, socket.AF_INET6):
try:
addr_bytes = socket.inet_pton(family, host)
yield self.write(family_to_byte[family] + addr_bytes)
host = socket.inet_ntop(family, addr_bytes)
yield self.write(struct.pack(">H", port))
raise gen.Return((host, port))
except socket.error:
continue
if rdns:
host_bytes = host.encode("idna")
yield self.write(b"\x03" + chr(len(host_bytes)).encode() + host_bytes)
else:
addresses = yield self.resolver.getaddrinfo(host, port, socket.AF_UNSPEC,
socket.SOCK_STREAM,
socket.IPPROTO_TCP,
socket.AI_ADDRCONFIG)
target_addr = addresses[0]
family = target_addr[0]
host = target_addr[4][0]
addr_bytes = socket.inet_pton(family, host)
yield self.write(family_to_byte[family] + addr_bytes)
host = socket.inet_ntop(family, addr_bytes)
yield self.write(struct.pack(">H", port))
raise gen.Return((host, port))
评论列表
文章目录