def direct_connect(self, host, port): connect_timeout = 30 if ':' in host: info = [(socket.AF_INET6, socket.SOCK_STREAM, 0, "", (host, port, 0, 0))] elif utils.check_ip_valid4(host): info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] else: try: info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror: info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] for res in info: af, socktype, proto, canonname, sa = res s = None try: s = socket.socket(af, socktype, proto) # See http://groups.google.com/group/cherrypy-users/ # browse_frm/thread/bbfe5eb39c904fe0 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 32 * 1024) s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, True) s.settimeout(connect_timeout) s.connect((host, port)) return s except socket.error: if s: s.close() return None
def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None): if type not in {socket.SOCK_STREAM, socket.SOCK_DGRAM}: msg = "Socket type must be stream or datagram, not {!r}" raise ValueError(msg.format(type)) self._proxyconn = None # TCP connection to keep UDP relay alive self.resolve_dest = True if self.default_proxy: self.proxy = self.default_proxy proxy_host = self.proxy[1] if utils.check_ip_valid6(proxy_host): family = socket.AF_INET6 elif utils.check_ip_valid4(proxy_host): family = socket.AF_INET else: self.proxy = (None, None, None, None, None, None) _BaseSocket.__init__(self, family, type, proto, _sock) self.proxy_sockname = None self.proxy_peername = None
def direct_connect(self, host, port): connect_timeout = 30 if b':' in host: info = [(socket.AF_INET6, socket.SOCK_STREAM, 0, "", (host, port, 0, 0))] elif utils.check_ip_valid4(host): info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] else: try: info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror: info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] for res in info: af, socktype, proto, canonname, sa = res s = None try: s = socket.socket(af, socktype, proto) # See http://groups.google.com/group/cherrypy-users/ # browse_frm/thread/bbfe5eb39c904fe0 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 32 * 1024) s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, True) s.settimeout(connect_timeout) s.connect((host, port)) return s except socket.error: if s: s.close() return None
def direct_connect(self, host, port): connect_timeout = 30 if b':' in host: info = [(socket.AF_INET6, socket.SOCK_STREAM, 0, "", (host, port, 0, 0))] elif utils.check_ip_valid4(host): info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] else: try: info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror: info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] for res in info: af, socktype, proto, canonname, sa = res s = None try: s = socket.socket(af, socktype, proto) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 32 * 1024) s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, True) s.settimeout(connect_timeout) s.connect((host, port)) return s except socket.error: if s: s.close() except Exception as e: xlog.warn("Connect to Dns server %s:%d fail:%r", host, port) return None
def get_connect_time(self, ip, port=None): record = self.get(ip) if not record or time.time() - record["update"] > self.ttl: if utils.check_ip_valid4(ip): return 6000 else: return 4000 else: return record["c"]
def send_request(self, id, server_ip, domain, dns_type): try: d = DNSRecord(DNSHeader(id)) d.add_question(DNSQuestion(domain, dns_type)) req4_pack = d.pack() if utils.check_ip_valid4(server_ip): self.sock.sendto(req4_pack, (server_ip, 53)) else: self.sock6.sendto(req4_pack, (server_ip, 53)) except Exception as e: xlog.warn("send_request except:%r", e)
def on_udp_query(self, rsock, req_data, addr): start_time = time.time() try: request = DNSRecord.parse(req_data) if len(request.questions) != 1: xlog.warn("query num:%d %s", len(request.questions), request) return domain = utils.to_bytes(str(request.questions[0].qname)) if domain.endswith(b"."): domain = domain[:-1] type = request.questions[0].qtype xlog.debug("DNS query:%s type:%d from %s", domain, type, addr) ips = g.dns_query.query(domain, type) if not ips: xlog.debug("query:%s type:%d from:%s, get fail, cost:%d", domain, type, addr, (time.time() - start_time) * 1000) reply = DNSRecord(DNSHeader(id=request.header.id, qr=1, aa=1, ra=1, auth=1), q=request.q) ips = utils.to_bytes(ips) for ip_cn in ips: ipcn_p = ip_cn.split(b"|") ip = ipcn_p[0] if utils.check_ip_valid4(ip) and type == 1: reply.add_answer(RR(domain, ttl=60, rdata=A(ip))) elif utils.check_ip_valid6(ip) and type == 28: reply.add_answer( RR(domain, rtype=type, ttl=60, rdata=AAAA(ip))) res_data = reply.pack() rsock.sendto(res_data, addr) xlog.debug("query:%s type:%d from:%s, return ip num:%d cost:%d", domain, type, addr, len(reply.rr), (time.time() - start_time) * 1000) except Exception as e: xlog.exception("on_query except:%r", e)
def do_connect(self, host, port): self.xlog.info("session_id:%s create_conn %d %s:%d", self.session.session_id, self.conn_id, host, port) connect_timeout = 30 sock = None # start_time = time.time() ip = "" try: if ':' in host: # IPV6 ip = host elif utils.check_ip_valid4(host): # IPV4 ip = host else: # xlog.debug("getting ip of %s", host) ip = socket.gethostbyname(host) # xlog.debug("resolve %s to %s", host, ip) sock = socket.socket(socket.AF_INET if ':' not in ip else socket.AF_INET6) # set reuseaddr option to avoid 10048 socket error sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # resize socket recv buffer ->256K to improve browser releated application performance sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 262144) # disable negal algorithm to send http request quickly. sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, True) # set a short timeout to trigger timeout retry more quickly. sock.settimeout(connect_timeout) sock.connect((ip, port)) # record TCP connection time # conn_time = time.time() - start_time # xlog.debug("tcp conn %s %s time:%d", host, ip, conn_time * 1000) return sock, True except Exception as e: # conn_time = int((time.time() - start_time) * 1000) # xlog.debug("tcp conn host:%s %s:%d fail t:%d %r", host, ip, port, conn_time, e) if sock: sock.close() return e, False
def test_check_ipv4(self): host = 'bat-bing-com.a-0001.a-msedge.net.' res = utils.check_ip_valid4(host) self.assertFalse(res)