#!/usr/bin/python3 ###################################################### # FlexRadio discovery Proxy CLIENT ###################################################### # # This script connects to the FlexRadio discovery # proxy and re-broadcasts all received packets. # # Author: Jakob Kordež, S52KJ # Docker: Žiga Kralj, S50ZK # GUI: Žiga Kralj, S50ZK # ###################################################### from socket import ( socket, AF_INET, SOCK_STREAM, SOCK_DGRAM, IPPROTO_UDP, SOL_SOCKET, SO_BROADCAST, ) from select import select def connect_proxy(server, port): # Create broadcast socket broadcastSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) broadcastSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) # Connect to TCP server with socket(AF_INET, SOCK_STREAM) as s: s.settimeout(5) print("Connecting to server...", (server, port)) # Try to connect to the server for 5 seconds try: s.connect((server, port)) print("Connected to server") print("\nPress Ctrl+C to exit...") except (ConnectionRefusedError, TimeoutError): print("Connection timed out") return 1 s.setblocking(False) try: while True: r = select([s], [], [], 1)[0] if len(r) == 0: continue payload = s.recv(2048) if not payload: print("Server disconnected") break broadcastSocket.sendto(payload, ("255.255.255.255", 4992)) except KeyboardInterrupt: print("\nExiting...") return 0 if __name__ == "__main__": import sys from argparse import ArgumentParser import re SERVER = "localhost" PORT = 4996 # Argument parsing serverRegex = r"^(?P[^:]+)(:(?P\d+))?$" parser = ArgumentParser( prog="FlexRadio discovery proxy client", description="Connect to a FlexRadio discovery proxy and re-broadcast all received packets", epilog="Author: Jakob Kordež, S52KJ", ) parser.add_argument( "server", metavar="SERVER", type=str, nargs="?", default=SERVER, help="Server address (default: %(default)s)", ) args = parser.parse_args() sp = re.fullmatch(serverRegex, args.server) if not sp: print("Invalid server address") sys.exit(1) SERVER = sp.group("host") if sp.group("port"): PORT = int(sp.group("port")) sys.exit(connect_proxy(SERVER, PORT))