flex-discovery-proxy/flex_proxy.py
2024-10-07 17:31:47 +02:00

78 lines
2.2 KiB
Python
Executable File

#!/usr/bin/python3
######################################################
# FlexRadio discovery Proxy
######################################################
#
# This script listens for FlexRadio discovery
# packets on UDP port 4992 and forwards them
# over a TCP connection to all connected clients.
#
# Author: Jakob Kordež, S52KJ
# Docker: Žiga Kralj, S50ZK
#
######################################################
from socket import socket, AF_INET, SOCK_STREAM, SOCK_DGRAM
from select import select
from time import time
import sys
TCP_PORT = 4996
UDP_PORT = 4992
# Listen for clients
tcp_socket = socket(AF_INET, SOCK_STREAM)
tcp_socket.bind(("", TCP_PORT))
tcp_socket.listen(5)
tcp_socket.setblocking(False)
# Listen for Discovery packets
udp_socket = socket(AF_INET, SOCK_DGRAM)
udp_socket.bind(("", UDP_PORT))
udp_socket.setblocking(False)
clients: list[socket] = []
print("\nPress Ctrl+C to exit...")
try:
while True:
r = select([tcp_socket, udp_socket, *clients], [], [], 1)[0]
s: socket
for s in r:
if s is tcp_socket:
# A client has connected
connection, client_address = tcp_socket.accept()
connection.setblocking(False)
clients.append(connection)
print("New connection from:", client_address)
elif s is udp_socket:
# Discovery packet received
data, client_address = udp_socket.recvfrom(2048)
print(int(time()), "Received discovery")
# Send discovery packet to all clients
for c in clients:
c.send(data)
else:
try:
data = s.recv(1024)
except:
data = None
if not data:
# A client socket has been disconnected
try:
print("Client disconnected:", s.getpeername())
s.close()
except:
print("Client disconnected")
clients.remove(s)
except:
print("\nExiting...")
for s in clients:
s.close()
tcp_socket.close()
udp_socket.close()
sys.exit(0)