|
12 | 12 | iperf3.client('192.168.1.5', udp=True, reverse=True) |
13 | 13 | """ |
14 | 14 |
|
15 | | -import sys, os, struct |
| 15 | +import sys, struct |
16 | 16 | import time, select, socket |
17 | 17 | import json |
18 | 18 |
|
| 19 | +# Provide a urandom() function, supporting devices without os.urandom(). |
| 20 | +try: |
| 21 | + from os import urandom |
| 22 | +except ImportError: |
| 23 | + from random import randint |
| 24 | + |
| 25 | + def urandom(n): |
| 26 | + return bytes(randint(0, 255) for _ in range(n)) |
| 27 | + |
| 28 | + |
19 | 29 | DEBUG = False |
20 | 30 |
|
21 | 31 | # iperf3 cookie size, last byte is null byte |
@@ -177,7 +187,7 @@ def recvninto(s, buf): |
177 | 187 | def make_cookie(): |
178 | 188 | cookie_chars = b"abcdefghijklmnopqrstuvwxyz234567" |
179 | 189 | cookie = bytearray(COOKIE_SIZE) |
180 | | - for i, x in enumerate(os.urandom(COOKIE_SIZE - 1)): |
| 190 | + for i, x in enumerate(urandom(COOKIE_SIZE - 1)): |
181 | 191 | cookie[i] = cookie_chars[x & 31] |
182 | 192 | return cookie |
183 | 193 |
|
@@ -243,7 +253,7 @@ def server_once(): |
243 | 253 | stats = Stats(param) |
244 | 254 | stats.start() |
245 | 255 | running = True |
246 | | - data_buf = bytearray(os.urandom(param["len"])) |
| 256 | + data_buf = bytearray(urandom(param["len"])) |
247 | 257 | while running: |
248 | 258 | for pollable in poll.poll(stats.max_dt_ms()): |
249 | 259 | if pollable_is_sock(pollable, s_ctrl): |
@@ -445,7 +455,7 @@ def client(host, udp=False, reverse=False, bandwidth=10 * 1024 * 1024): |
445 | 455 | s_data = socket.socket(ai[0], socket.SOCK_STREAM) |
446 | 456 | s_data.connect(ai[-1]) |
447 | 457 | s_data.sendall(cookie) |
448 | | - buf = bytearray(os.urandom(param["len"])) |
| 458 | + buf = bytearray(urandom(param["len"])) |
449 | 459 | elif cmd == EXCHANGE_RESULTS: |
450 | 460 | # Close data socket now that server knows we are finished, to prevent it flooding us |
451 | 461 | poll.unregister(s_data) |
|
0 commit comments