Files
dpdk-ws-client/test/kern_c_test.py

57 lines
1.9 KiB
Python

#!/usr/bin/env python3
import socket, time, random, json, base64
latencies = []
for run in range(10):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
t0 = time.time()
s.connect(('192.168.123.132', 8080))
t_conn = time.time() - t0
key = base64.b64encode(bytes([random.randint(0,255) for _ in range(16)])).decode()
req = (f'GET /ws HTTP/1.1\r\n'
f'Host: 192.168.123.132:8080\r\n'
f'Upgrade: websocket\r\n'
f'Connection: Upgrade\r\n'
f'Sec-WebSocket-Key: {key}\r\n'
f'Sec-WebSocket-Version: 13\r\n'
f'\r\n')
s.sendall(req.encode())
s.recv(4096)
t_hs = time.time() - t0
msg = json.dumps({'action':'ping'})
frame = bytearray([0x81, 0x80 | len(msg)])
mk = bytes([random.randint(0,255) for _ in range(4)])
frame.extend(mk)
for i,b in enumerate(msg.encode()):
frame.append(b ^ mk[i%4])
t1 = time.time()
s.sendall(bytes(frame))
s.recv(4096)
t_echo = time.time() - t1
cl = bytearray([0x88, 0x80, 0x00, 0x00, 0x00, 0x00])
s.sendall(cl)
s.close()
latencies.append((t_conn*1000, t_hs*1000, t_echo*1000))
print(f' run{run+1}: connect={t_conn*1000:.2f}ms hs={t_hs*1000:.2f}ms echo={t_echo*1000:.2f}ms')
time.sleep(0.15)
a_c = sum(x[0] for x in latencies)/10
a_h = sum(x[1] for x in latencies)/10
a_e = sum(x[2] for x in latencies)/10
min_c = min(x[0] for x in latencies)
min_h = min(x[1] for x in latencies)
min_e = min(x[2] for x in latencies)
max_c = max(x[0] for x in latencies)
max_h = max(x[1] for x in latencies)
max_e = max(x[2] for x in latencies)
print(f'\nKernel TCP + C Server (10 runs):')
print(f' connect: min={min_c:.2f}ms avg={a_c:.2f}ms max={max_c:.2f}ms')
print(f' handshake: min={min_h:.2f}ms avg={a_h:.2f}ms max={max_h:.2f}ms')
print(f' echo RTT: min={min_e:.2f}ms avg={a_e:.2f}ms max={max_e:.2f}ms')