Ziel dieser Aufgabe ist es, einen Server für den Proof-of-Work Mechanismus zu erstellen. Dazu soll auf Basis der vorherigen Aufgaben ein Server erstellt werden, der folgende Funktionalität aufweist:
Der Code muss modular erstellt werden. Wie Sie eigene Crates in Ihrem Projekt benutzen, haben Sie bereits in hw9 Task2 kennen gelernt.
Die einzelnen Aufgabenteile sind grob beschrieben. Wie Sie im Detail die Aufgabe umsetzen, ist Ihnen überlassen.
Die Nachricht besteht aus einem String mit “Muster,<Zahlenraum>,<Port>“:
Um einen parallelen Zugriff auf den Server zu ermöglichen, muss die bisherige Datenstruktur des Servers aus HW9 für einen parallelen Zugriff entsprechend erweitert werden
Aufträge für Server werden in die Auftrags-Queue geschrieben und die Einträge in dieser Queue vom Server nacheinander ausgeführt. Zunächst wird das gefundene Ergebnis auf der Konsole ausgegeben. Implementieren Sie das Verhalten des Servers entsprechend der Nachricht in der Auftrags-Queue:
exit: kontrolliertes Beenden des Servers.halt: sofortiges Anhalten der Aufträge, so dass keine CPU Last mehr vom
Server ausgeht. Der Status des gerade bearbeiteten Auftrags muss nicht
gesichert werden.continue: Fortfahren mit den Aufträgen, ein evtl. zuvor abgebrochener
Auftrag wird wiederholtthreads: Ändern der Anzahl der Threads, die zum Suchen verwendet werden.
Dies wirkt sich erst beim nächsten zu bearbeitenden Auftrag aus, sofern
dieses Kommando während der Ausführung eines Auftrags auftritt.Beim obigen exit Kommando gehen bisher alle Daten in der Auftrags-Queue, sowie
verschiedener möglicher Ergebnis-Queues verloren. Um dies zu vermeiden werden
vor dem Beenden des Servers mögliche Einträge in den Queues auf der Festplatte
gespeichert und beim Starten des Servers wieder eingelesen. Zum Serialisieren
der Queue-Einträge dürfen Sie externe Crates benutzen.
Wird der Server gestartet überprüft er somit, ob evtl. alte Zustände auf der Festplatte vorhanden sind und falls nicht, initialisiert er eine leere Auftrags-Queue und erstellt zunächst auch keine Ergebnis-Queue(s).
Implementieren Sie eine hierarchische Fehlerbehandlung, bei der mögliche Fehler über generische Fehlertypen der jeweiligen Crates an den Server übergeben und dort ausgewertet und behandelt werden. Dazu stellt jede Crate einen(!) eigenen Fehlertypen zu Verfügung.
Erstellen Sie ausführliche Dokumentationen Ihrer Library (Sub-Crates) Funktionen, die exportiert werden, sodass beim Aufruf von cargo doc eine aussagekräftige Doku Ihrer API existiert. Schreiben Sie eine eigene ‘DESIGN.md’ Datei in Markdown Syntax, in welcher Sie das Design Ihres Servers beschreiben (Umfang 1-2 Seiten).
Für den letzten Aufgabenteil dürfen Sie externe Crates benutzen. Ansonsten sind alle bisher in den Laboraufgaben genannten Crates erlaubt. Zum Logging Ihrer Applikation (kann zur Fehlersuche bei komplexeren Programmen hilfreich sein) sind ebenfalls externe Crates erlaubt.
Achten Sie auf eine ausreichende Testabdeckung, um innerhalb Ihrer Crates alle verwendeten Funktionen zu testen.