import socket
import threading
import time
import signal

TOTAL_PAQUETES = 10000
DNS = "nlb-recepcion-tcp-98af84506c9b42a6.elb.us-east-1.amazonaws.com"
PUERTO = 7001
THREADS = 1

contador_enviados = 0
lock = threading.Lock()
stop_event = threading.Event()

# Paquete fijo a enviar
PAQUETE_FIJO = "+RESP:GTFRI,500101,999999999999999,GV55W,12703,10,1,1,0.0,229,36.3,-160.214542,-69.167062,20250618103010,ebed,0007,1168,16C073,00,0.0,,,,96,110000,,,,20250429113541,5111$"

def enviar_paquetes():
    global contador_enviados
    while not stop_event.is_set():
        with lock:
            if contador_enviados >= TOTAL_PAQUETES:
                return
            id_unico = contador_enviados + 1
            contador_enviados += 1

        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(2)
            sock.connect((DNS, PUERTO))
            sock.sendall(PAQUETE_FIJO.encode())
            sock.close()
            # print(f"[✓] ID enviado: {id_unico}")  # Comentado para mejor rendimiento
        except Exception as e:
            print(f"[X] ID {id_unico} - Error: {e}")

def signal_handler(sig, frame):
    print("\nInterrumpido. Deteniendo envío.")
    stop_event.set()

def main():
    print(f"\n🚀 Iniciando envío de {TOTAL_PAQUETES} paquetes a {DNS}:{PUERTO} con {THREADS} hilo(s)...")
    signal.signal(signal.SIGINT, signal_handler)
    start = time.time()

    threads = []
    for _ in range(THREADS):
        t = threading.Thread(target=enviar_paquetes)
        t.start()
        threads.append(t)

    for t in threads:
        t.join()

    end = time.time()
    duracion = end - start

    print("\n✅ Envío completado.")
    print(f"🔢 Paquetes enviados: {contador_enviados} de {TOTAL_PAQUETES}")
    print(f"⏱ Duración total: {duracion:.2f} segundos")
    print(f"⚡ Velocidad promedio: {contador_enviados / duracion:.2f} paquetes/segundo")

if __name__ == "__main__":
    main()
