|
3 | 3 | import socket
|
4 | 4 |
|
5 | 5 | NUM_NEW_SOCKETS = 4
|
6 |
| -NUM_TRANSFERS = 4 |
| 6 | +NUM_TRANSFERS = 10 |
| 7 | +TOTAL_PACKETS = NUM_NEW_SOCKETS * NUM_TRANSFERS |
| 8 | +# If more than 75% of packets are lost, the test fails. |
| 9 | +PACKET_LOSS_THRESH = 0.75 * TOTAL_PACKETS |
7 | 10 | PORT = 8000
|
8 | 11 |
|
| 12 | + |
| 13 | +def print_stats(seq): |
| 14 | + if (TOTAL_PACKETS - seq) > PACKET_LOSS_THRESH: |
| 15 | + print( |
| 16 | + "packet loss %.1f%% %d/%d" |
| 17 | + % (((TOTAL_PACKETS - seq) / TOTAL_PACKETS * 100), seq, TOTAL_PACKETS) |
| 18 | + ) |
| 19 | + else: |
| 20 | + print("pass") |
| 21 | + |
| 22 | + |
9 | 23 | # Server
|
10 | 24 | def instance0():
|
| 25 | + seq = 0 |
11 | 26 | multitest.globals(IP=multitest.get_network_ip())
|
12 | 27 | multitest.next()
|
13 | 28 | for i in range(NUM_NEW_SOCKETS):
|
14 | 29 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
15 | 30 | s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
16 |
| - s.bind(socket.getaddrinfo("0.0.0.0", PORT)[0][-1]) |
| 31 | + s.bind(socket.getaddrinfo("0.0.0.0", PORT + i)[0][-1]) |
| 32 | + s.settimeout(0.250) |
17 | 33 | multitest.broadcast("server ready")
|
18 | 34 | for j in range(NUM_TRANSFERS):
|
19 |
| - data, addr = s.recvfrom(1000) |
20 |
| - print(data) |
21 |
| - s.sendto(b"server to client %d %d" % (i, j), addr) |
| 35 | + try: |
| 36 | + data, addr = s.recvfrom(1000) |
| 37 | + except: |
| 38 | + continue |
| 39 | + if int(data) == seq: |
| 40 | + if seq < (TOTAL_PACKETS - PACKET_LOSS_THRESH): |
| 41 | + print(seq) |
| 42 | + seq += 1 |
| 43 | + s.sendto(b"%d" % (seq), addr) |
22 | 44 | s.close()
|
23 | 45 |
|
| 46 | + print_stats(seq) |
| 47 | + |
24 | 48 |
|
25 | 49 | # Client
|
26 | 50 | def instance1():
|
| 51 | + seq = 0 |
27 | 52 | multitest.next()
|
28 |
| - ai = socket.getaddrinfo(IP, PORT)[0][-1] |
29 | 53 | for i in range(NUM_NEW_SOCKETS):
|
| 54 | + ai = socket.getaddrinfo(IP, PORT + i)[0][-1] |
30 | 55 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
| 56 | + s.settimeout(0.250) |
31 | 57 | multitest.wait("server ready")
|
32 | 58 | for j in range(NUM_TRANSFERS):
|
33 |
| - s.sendto(b"client to server %d %d" % (i, j), ai) |
34 |
| - data, addr = s.recvfrom(1000) |
35 |
| - print(data) |
| 59 | + s.sendto(b"%d" % (seq), ai) |
| 60 | + try: |
| 61 | + data, addr = s.recvfrom(1000) |
| 62 | + except: |
| 63 | + continue |
| 64 | + if int(data) == seq + 1: |
| 65 | + if seq < (TOTAL_PACKETS - PACKET_LOSS_THRESH): |
| 66 | + print(seq) |
| 67 | + seq += 1 |
36 | 68 | s.close()
|
| 69 | + |
| 70 | + print_stats(seq) |
0 commit comments