diff --git a/tools/query.py b/tools/query.py index da32c86ae..d16fb7371 100644 --- a/tools/query.py +++ b/tools/query.py @@ -2,7 +2,7 @@ # simple client for server status queries -import sys, os, socket, struct, time +import sys, os, socket, struct, selectors DEFAULT_PORT = 27100 QUERY_MAGIC = b"PDQM\x01" @@ -48,48 +48,58 @@ sockfam = socket.AF_INET if ':' in host: sockfam = socket.AF_INET6 +sel = selectors.DefaultSelector() sock = socket.socket(sockfam, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) sock.settimeout(MAX_WAIT) +sel.register(sock, selectors.EVENT_READ, None) -# send query magic to server +# send query magic to server(s) sock.sendto(QUERY_MAGIC, (host, port)) -# wait for response -data = sock.recv(256) +while True: + # wait for response + events = sel.select(1.0) # timeout in seconds + if not events: + break -# check magic -if data[:5] != QUERY_MAGIC: - print("invalid magic: expected", QUERY_MAGIC, "got", data[:5]) - sys.exit(1) + for (key, mask) in events: + data = sock.recv(256) -# check checksum -chkremote = struct.unpack(" len(data): - print("invalid size: expected", len(data), "got", datalen) - sys.exit(1) + # check checksum + chkremote = struct.unpack(" len(data): + print("invalid size: expected", len(data), "got", datalen) + sys.exit(1) -# unpack fixed size part of the response -msgdata = struct.unpack_from("