コード例 #1
0
ファイル: client.py プロジェクト: M-ouse/CleverSwarm
 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()
コード例 #2
0
    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!")
コード例 #3
0
ファイル: client.py プロジェクト: itzmejawad/clever-show
    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()
コード例 #4
0
    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!")