def broadcast_bind(self): broadcast_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) broadcast_client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) broadcast_client.bind(("", self.broadcast_port)) try: while True: data, addr = broadcast_client.recvfrom(self.BUFFER_SIZE) message = messaging.MessageManager() message.income_raw = data message.process_message() if message.content: logger.info("Received broadcast message {} from {}".format( message.content, addr)) if message.content["command"] == "server_ip": args = message.content["args"] self.server_port = int(args["port"]) self.server_host = args["host"] self.write_config( False, ConfigOption("SERVER", "port", self.server_port), ConfigOption("SERVER", "host", self.server_host)) logger.info("Binding to new IP: {}:{}".format( self.server_host, self.server_port)) break finally: broadcast_client.close()
def _broadcast_listen(self): logging.info("Broadcast listener thread started!") broadcast_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) broadcast_client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # broadcast_client.settimeout(1) try: broadcast_client.bind(("", self.config.broadcast_port)) except OSError: self.terminate( "Another server is running on this computer, shutting down!") return try: while self.listener_thread_running.is_set(): try: data, addr = broadcast_client.recvfrom( 1024) # TODO nonblock except OSError: logging.error(f"Cannot receive broadcast due error {e}") continue message = messaging.MessageManager() message.income_raw = data message.process_message() content = message.content right_command = (content and message.jsonheader["action"] == "server_ip") if right_command: different_id = content["kwargs"]["id"] != str(self.id) self_younger = float( content["kwargs"]["start_time"]) <= self.time_started if different_id and self_younger: # younger server should shut down self.terminate( "Another server detected over the network, shutting down!" ) else: logging.warning( "Got wrong broadcast message from {}".format(addr)) except Exception as e: logging.error(f"Unexpected error {e}!") raise finally: broadcast_client.close() logging.info("Broadcast listener thread stopped, socked closed!")
def broadcast_bind(self, timeout=2.0, attempt_limit=3): broadcast_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) broadcast_client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) broadcast_client.bind(("", self.broadcast_port)) broadcast_client.settimeout(timeout) attempt_count = 0 try: while attempt_count <= attempt_limit: try: data, addr = broadcast_client.recvfrom(self.BUFFER_SIZE) except socket.error as error: logger.warning( "Could not receive broadcast due error: {}".format( error)) attempt_count += 1 else: message = messaging.MessageManager() message.income_raw = data message.process_message() if message.content: logger.info( "Received broadcast message {} from {}".format( message.content, addr)) if message.content["command"] == "server_ip": args = message.content["args"] self.server_port = int(args["port"]) self.server_host = args["host"] self.write_config( False, ConfigOption("SERVER", "port", self.server_port), ConfigOption("SERVER", "host", self.server_host)) logger.info("Binding to new IP: {}:{}".format( self.server_host, self.server_port)) self.on_broadcast_bind() break finally: broadcast_client.close()
def _broadcast_listen(self): logging.info("Broadcast listener thread started!") broadcast_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) broadcast_client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) try: broadcast_client.bind(("", self.broadcast_port)) except OSError: logging.critical( "Another server is running on this computer, shutting down!") # TODO popup and as function self.stop() try: while self.listener_thread_running.is_set(): data, addr = broadcast_client.recvfrom(1024) # TODO nonblock message = messaging.MessageManager() message.income_raw = data message.process_message() if message.content: if message.content["command"] == "server_ip": if message.content["args"]["id"] != str(self.id) \ and float(message.content["args"]["start_time"]) <= self.time_started: # younger server should shut down logging.critical( "Another server detected over the network, shutting down!" ) # TODO popup self.stop() else: logging.warning( "Got wrong broadcast message from {}".format(addr)) finally: broadcast_client.close() logging.info("Broadcast listener thread stopped, socked closed!")