From 0669ce5668f4c791d64a751fe33e32a39f102802 Mon Sep 17 00:00:00 2001 From: GreaseMonkey Date: Tue, 6 Feb 2024 12:05:17 +1300 Subject: [PATCH 1/3] port-net: query.py: Allow querying broadcast This waits for the first reply and then exits. --- tools/query.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/query.py b/tools/query.py index 4187e18ad..da32c86ae 100644 --- a/tools/query.py +++ b/tools/query.py @@ -49,6 +49,7 @@ if ':' in host: sockfam = socket.AF_INET6 sock = socket.socket(sockfam, socket.SOCK_DGRAM) +sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) sock.settimeout(MAX_WAIT) # send query magic to server From dface4696ca0b615fe4e0446213530600f382f42 Mon Sep 17 00:00:00 2001 From: GreaseMonkey Date: Tue, 6 Feb 2024 12:14:20 +1300 Subject: [PATCH 2/3] 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(" Date: Tue, 6 Feb 2024 12:16:05 +1300 Subject: [PATCH 3/3] port-net: query.py: Print reply source addresses --- tools/query.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/query.py b/tools/query.py index d16fb7371..5145c196a 100644 --- a/tools/query.py +++ b/tools/query.py @@ -64,7 +64,7 @@ while True: break for (key, mask) in events: - data = sock.recv(256) + data, from_addr = sock.recvfrom(256) # check magic if data[:5] != QUERY_MAGIC: @@ -93,6 +93,7 @@ while True: romname, data = eat_string(data) moddir, data = eat_string(data) + print("address:", from_addr) print("protocol ver:", msgdata[0]) print("in progress:", msgdata[1]) print("clients: {0}/{1}".format(msgdata[2], msgdata[3]))