From 4688268bc23dc6095e5aafbbc466afb83f108cf1 Mon Sep 17 00:00:00 2001
From: Quoc Dao <quoc.dao@student.reutlingen-university.de>
Date: Sun, 4 Feb 2024 22:14:42 +0100
Subject: [PATCH] chat fix

---
 client.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 server.py | 16 ++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)

diff --git a/client.py b/client.py
index 4f1cae8..9ddf7a8 100644
--- a/client.py
+++ b/client.py
@@ -1,6 +1,8 @@
 import socket
 import threading
 from datetime import datetime
+import time
+import struct
 
 MULTICAST_GROUP_IP = '224.1.1.1'
 
@@ -64,6 +66,50 @@ class Client():
                         
             except socket.timeout:
                 pass
+            except ConnectionResetError:
+                # Verbindung zum Leader wurde zurückgesetzt
+                print("Connection to the leader server was reset. Attempting to reconnect...")
+                self.server_socket.close()  # Schließe die vorhandene Verbindung
+                time.sleep(1)  # Warte eine Sekunde, bevor eine neue Verbindung hergestellt wird
+                self.connect_to_leader()  # Methode aufrufen, um eine Verbindung zum aktuellen Leader herzustellen
+
+
+    def connect_to_leader(self):
+        try:
+            # Verbindung zum aktuellen Leader herstellen
+            self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            self.server_socket.connect((self.currentLeader, 5555))
+            print("Reconnected to the leader server.")
+        except Exception as e:
+            print(f"Failed to reconnect to the leader server: {str(e)}")
+
+
+    def listen_for_new_leader(self):
+        # Socket zum Empfangen von Multicast-Nachrichten erstellen
+        multicast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
+        multicast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        multicast_socket.bind(('', CLIENT_MULTICAST_PORT))
+
+        # Multicast-Gruppe beitreten
+        group = socket.inet_aton(MULTICAST_GROUP_IP)
+        mreq = struct.pack('4sL', group, socket.INADDR_ANY)
+        multicast_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
+
+        while True:
+            try:
+                # Nachrichten von potenziellen neuen Leadern empfangen
+                data, address = multicast_socket.recvfrom(1024)
+                if data:
+                    new_leader_address = data.decode()
+                    if new_leader_address != self.currentLeader:
+                        print(f"New leader detected: {new_leader_address}")
+                        self.currentLeader = new_leader_address
+                        # Verbindung zum neuen Leader herstellen
+                        self.connect_to_leader()
+
+            except socket.timeout:
+                pass
+
 
     def receive_messages(self):
         while True:
@@ -83,5 +129,10 @@ if __name__ == "__main__":
     client = Client()
 
     thread1 = threading.Thread(target = client.MulticastSendAndReceive)
+    thread2 = threading.Thread(target=client.listen_for_new_leader)
+   
     thread1.start()
-    thread1.join()
\ No newline at end of file
+    thread2.start()
+
+    thread1.join()
+    thread2.join()
\ No newline at end of file
diff --git a/server.py b/server.py
index 6e1c1eb..714e818 100644
--- a/server.py
+++ b/server.py
@@ -278,6 +278,19 @@ class Server():
         finally:
             ring_socket.close()
 
+    def handle_new_leader(self):
+        # Funktion, um den neuen Leader zu behandeln und seine IP-Adresse zu senden
+        multicast_group = (MULTICAST_GROUP_IP, SERVER_MULTICAST_PORT)
+        multicast_send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+        while True:
+            # Überprüfe, ob ein neuer Leader gewählt wurde
+            if self.is_leader:
+                # Sende die IP-Adresse des Leaders an die Multicast-Gruppe
+                multicast_send_sock.sendto(self.leader_ip.encode(), multicast_group)
+                time.sleep(1)  # Warte kurz, bevor du die IP-Adresse erneut sendest
+
+
     def init_heartbeat(self):
         self.leader_heartbeat_last_received = time.time()
         self.heartbeat_interval = 1  # seconds
@@ -358,6 +371,9 @@ if __name__== '__main__':
     thread_heartbeat = threading.Thread(target = server.init_heartbeat)
     thread_heartbeat.start()
 
+    thread_new_leader = threading.Thread(target=server.handle_new_leader)
+    thread_new_leader.start()
+
     # Socket erstellen und binden
     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     server_socket.bind((MY_IP, 5555))
-- 
GitLab