diff --git a/server.py b/server.py index 9bf30029c7e4b10c57122b238166bf274d195721..4b1fa84c775c1d70c616c35131463e491cb1e01f 100644 --- a/server.py +++ b/server.py @@ -284,39 +284,40 @@ class Server(): self.missed_heartbeats_limit = 5 self.missed_heartbeats = 0 - # multicast_group = (MULTICAST_GROUP_IP, HEARTBEAT_PORT) - heartbeat_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - - # Set the time-to-live for messages to 1 so they do not go past the local network segment. - # heartbeat_socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1) - heartbeat_socket.bind(('', HEARTBEAT_PORT)) - + + # Erstelle und binde den Multicast-Socket für Heartbeats + multicast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + multicast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + multicast_socket.bind((MY_IP, HEARTBEAT_PORT)) multicast_group = socket.inet_aton(MULTICAST_GROUP_IP) - mreg = struct.pack('4sL', multicast_group, socket.INADDR_ANY) - heartbeat_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreg) + mreq = struct.pack('4sL', multicast_group, socket.INADDR_ANY) + multicast_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) - threading.Thread(target=self.heartbeat_subscriber, args=(heartbeat_socket, multicast_group)).start() - threading.Thread(target=self.heartbeat_publisher, args=(heartbeat_socket, multicast_group)).start() + # Starte Heartbeat-Sender- und Empfänger-Threads + threading.Thread(target=self.heartbeat_publisher, args=(multicast_socket,)).start() + threading.Thread(target=self.heartbeat_subscriber, args=(multicast_socket,)).start() + - def heartbeat_publisher(self, heartbeat_socket, multicast_group): + def heartbeat_publisher(self, multicast_socket): while True: if self.is_leader: print('\n I am Leader, sending heartbeat\n') - # Code to sends a heartbeat message - msg = '#' - heartbeat_socket.sendto(msg.encode(), (MULTICAST_GROUP_IP, HEARTBEAT_PORT)) - time.sleep(self.heartbeat_interval) + heartbeat_message = "#" + multicast_socket.sendto(heartbeat_message.encode(), (MULTICAST_GROUP_IP, HEARTBEAT_PORT)) + time.sleep(self.heartbeat_interval) - def heartbeat_subscriber(self, heartbeat_socket, multicast_group): + def heartbeat_subscriber(self, multicast_socket): while True: - if not self.is_leader: - print('\nWaiting to receive heartbeat...\n') - data, address = heartbeat_socket.recvfrom(1024) - if data: - print(data.decode()) - heartbeat_socket.sendto('#'.encode(), address) + data, address = multicast_socket.recvfrom(1024) + if data: + sender_ip = address[0] + if sender_ip != MY_IP: + print(f"Received heartbeat from {address}: {data.decode()}") + # Hier kannst du die Logik hinzufügen, um den Status des Heartbeats zu verarbeiten + time.sleep(1) + # time_since_last_heartbeat = time.time() - self.leader_heartbeat_last_received