"""Request/response latency through a TCP port. server: rr.py serve PORT; client: rr.py PORT""" import socket, struct, sys, time def recvn(s, n): b = bytearray() while len(b) < n: c = s.recv(n - len(b)) if not c: raise EOFError b += c return bytes(b) if sys.argv[1] == "serve": l = socket.socket(); l.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) l.bind(("0.0.0.0", int(sys.argv[2]))); l.listen() while True: s, _ = l.accept(); s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) try: while True: req, resp = struct.unpack("!II", recvn(s, 8)); recvn(s, req); s.sendall(b"r" * resp) except EOFError: s.close() else: s = socket.create_connection(("127.0.0.1", int(sys.argv[1]))); s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) for label, req, resp in [("request", n, 16) for n in (4000, 7372, 7380, 8000, 9000, 16000, 20000)] + [("response", 16, n) for n in (4000, 7380, 8000, 16000, 64000)]: ts = [] for _ in range(3): t0 = time.perf_counter(); s.sendall(struct.pack("!II", req, resp) + b"q" * req); recvn(s, resp); ts.append((time.perf_counter() - t0) * 1000) print(f"{label:8} {max(req, resp) if label == 'request' and False else (req if label=='request' else resp):6d} B: " + " ".join(f"{t:6.1f}" for t in ts) + " ms", flush=True)