def _create_connection(self, ipaddr, forward, queobj):
ip = ipaddr[0]
try:
# create a ipv4/ipv6 socket object
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)
# set struct linger{l_onoff=1,l_linger=0} to avoid 10048 socket error
sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, self.offlinger_val)
# resize socket recv buffer 8K->1M to improve browser releated application performance
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1048576)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 32768)
# disable nagle 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(forward if forward else 1)
set_connect_start(ip)
# start connection time record
start_time = time()
# TCP connect
sock.connect(ipaddr)
# record TCP connection time
self.tcp_connection_time[ipaddr] = sock.tcp_time = time() - start_time
# put socket object to output queobj
sock.xip = ipaddr
queobj.put(sock)
except NetWorkIOError as e:
# any socket.error, put Excpetions to output queobj.
e.xip = ipaddr
queobj.put(e)
# reset a large and random timeout to the ipaddr
self.tcp_connection_time[ipaddr] = self.timeout + 1
# close tcp socket
sock.close()
finally:
set_connect_finish(ip)
评论列表
文章目录