From dface4696ca0b615fe4e0446213530600f382f42 Mon Sep 17 00:00:00 2001 From: GreaseMonkey Date: Tue, 6 Feb 2024 12:14:20 +1300 Subject: [PATCH] port-net: query.py: List all server query replies This is for when one provides a broadcast address to query. --- tools/query.py | 78 ++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 34 deletions(-) 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("