|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+# Homework hw10 task1
|
|
|
2
|
+
|
|
|
3
|
+- [Ziel](#ziel)
|
|
|
4
|
+- [Aufbau der Nachricht](#aufbau-der-nachricht)
|
|
|
5
|
+- [Aufgaben](#aufgaben)
|
|
|
6
|
+ - [Synchronisierung der Queue](#synchronisierung-der-queue)
|
|
|
7
|
+ - [Einbindung Proof-of-Work Mechanismus mit mehreren Threads](#einbindung-proof-of-work-mechanismus-mit-mehreren-threads)
|
|
|
8
|
+ - [Kommandos des Servers](#kommandos-des-servers)
|
|
|
9
|
+ - [Datenverlust vermeiden](#datenverlust-vermeiden)
|
|
|
10
|
+- [Fehlerbehandlung](#fehlerbehandlung)
|
|
|
11
|
+- [Dokumentation](#dokumentation)
|
|
|
12
|
+- [Bibliothek](#bibliothek)
|
|
|
13
|
+- [Testabdeckung](#testabdeckung)
|
|
|
14
|
+ Threads](#einbindung-proof-of-work-mechanismus-mit-mehreren-threads)
|
|
|
15
|
+ - [Kommandos des Servers](#kommandos-des-servers)
|
|
|
16
|
+ - [Datenverlust vermeiden](#datenverlust-vermeiden)
|
|
|
17
|
+- [Fehlerbehandlung](#fehlerbehandlung)
|
|
|
18
|
+- [Dokumentation](#dokumentation)
|
|
|
19
|
+- [Bibliothek](#bibliothek)
|
|
|
20
|
+- [Testabdeckung](#testabdeckung)
|
|
|
21
|
+
|
|
|
22
|
+## Ziel
|
|
|
23
|
+
|
|
|
24
|
+Ziel dieser Aufgabe ist es, einen Server für den Proof-of-Work Mechanismus zu
|
|
|
25
|
+erstellen. Dazu soll auf Basis der vorherigen Aufgaben ein Server erstellt
|
|
|
26
|
+werden, der folgende Funktionalität aufweist:
|
|
|
27
|
+
|
|
|
28
|
+- unbegrenzter paralleler Zugriff von Clients, um das Suchen von Hashwerten
|
|
|
29
|
+ anzufordern und gefundene Hashes abzufragen. Die Clients (z.B. **nc**)
|
|
|
30
|
+ übertragen dazu jeweils Nachrichten mit den Informationen:
|
|
|
31
|
+ - Muster,
|
|
|
32
|
+ - \<Zahlenraum\>
|
|
|
33
|
+ - \<Port\>
|
|
|
34
|
+- Multi-Threaded Implementierung für das Suchen der Hashes
|
|
|
35
|
+ - wird kein Zahlenraum angegeben, dann wird ein Hash gesucht, der das
|
|
|
36
|
+ Muster enthält.
|
|
|
37
|
+- Interaktion mit dem Server über Kommandos, um den Server zu parametrisieren
|
|
|
38
|
+ und zu steuern
|
|
|
39
|
+- Beenden und späteres Starten des Servers ohne Datenverluste.
|
|
|
40
|
+
|
|
|
41
|
+Der Code muss modular erstellt werden. Wie Sie eigene Crates in Ihrem Projekt
|
|
|
42
|
+benutzen, haben Sie bereits in hw9 Task2 kennen gelernt.
|
|
|
43
|
+
|
|
|
44
|
+Die einzelnen Aufgabenteile sind grob beschrieben. Wie Sie im Detail die Aufgabe
|
|
|
45
|
+umsetzen, ist Ihnen überlassen.
|
|
|
46
|
+
|
|
|
47
|
+## Aufbau der Nachricht
|
|
|
48
|
+
|
|
|
49
|
+Die Nachricht besteht aus einem String mit "Muster,\<Zahlenraum>,\<Port>":
|
|
|
50
|
+
|
|
|
51
|
+- Muster muss immer angegeben werden
|
|
|
52
|
+- Zahlenraum ist optional. Enthält die Nachricht diesen Wert, so werden ALLE
|
|
|
53
|
+ Hashes im Zahlenraum gesucht, die dieses Muster enthalten.
|
|
|
54
|
+- Port ist optional. Enthält die Nachricht diesen Eintrag, so wird das
|
|
|
55
|
+ Ergebnis in einer Ergebnis-Queue abgelegt, die der Client über die
|
|
|
56
|
+ Portnummer erreicht.
|
|
|
57
|
+
|
|
|
58
|
+## Aufgaben
|
|
|
59
|
+
|
|
|
60
|
+### Synchronisierung der Queue
|
|
|
61
|
+
|
|
|
62
|
+Um einen parallelen Zugriff auf den Server zu ermöglichen, muss die bisherige
|
|
|
63
|
+Datenstruktur des Servers aus HW9 für einen parallelen Zugriff entsprechend
|
|
|
64
|
+erweitert werden
|
|
|
65
|
+
|
|
|
66
|
+### Einbindung Proof-of-Work Mechanismus mit mehreren Threads
|
|
|
67
|
+
|
|
|
68
|
+Aufträge für Server werden in die Auftrags-Queue geschrieben und die Einträge in
|
|
|
69
|
+dieser Queue vom Server nacheinander ausgeführt. Zunächst wird das gefundene
|
|
|
70
|
+Ergebnis auf der Konsole ausgegeben. Implementieren Sie das Verhalten des
|
|
|
71
|
+Servers entsprechend der Nachricht in der Auftrags-Queue:
|
|
|
72
|
+
|
|
|
73
|
+- Wird nur ein "Muster" angegeben, so sucht der Server mit mehreren Threads
|
|
|
74
|
+ nach EINEM Hashwert, der dieses Muster enthält.
|
|
|
75
|
+- Wird "Muster,Zahlenraum" angegeben, so werden alle Hashes mit diesem Muster
|
|
|
76
|
+ im Zahlenraum gesucht.
|
|
|
77
|
+- Wird "Muster,Zahlenraum,Portnummer" angegeben, so werden alle gefundenen
|
|
|
78
|
+ Hashes im Zahlenraum in einer extra Queue (Ergebnis-Queue) gespeichert und
|
|
|
79
|
+ können dort vom Client (z.B. **nc**) ausgelesen werden.
|
|
|
80
|
+
|
|
|
81
|
+### Kommandos des Servers
|
|
|
82
|
+
|
|
|
83
|
+- `exit`: kontrolliertes Beenden des Servers.
|
|
|
84
|
+- `halt`: sofortiges Anhalten der Aufträge, so dass keine CPU Last mehr vom
|
|
|
85
|
+ Server ausgeht. Der Status des gerade bearbeiteten Auftrags muss nicht
|
|
|
86
|
+ gesichert werden.
|
|
|
87
|
+- `continue`: Fortfahren mit den Aufträgen, ein evtl. zuvor abgebrochener
|
|
|
88
|
+ Auftrag wird wiederholt
|
|
|
89
|
+- `threads`: Ändern der Anzahl der Threads, die zum Suchen verwendet werden.
|
|
|
90
|
+ Dies wirkt sich erst beim nächsten zu bearbeitenden Auftrag aus, sofern
|
|
|
91
|
+ dieses Kommando während der Ausführung eines Auftrags auftritt.
|
|
|
92
|
+
|
|
|
93
|
+### Datenverlust vermeiden
|
|
|
94
|
+
|
|
|
95
|
+Beim obigen `exit` Kommando gehen bisher alle Daten in der Auftrags-Queue, sowie
|
|
|
96
|
+verschiedener möglicher Ergebnis-Queues verloren. Um dies zu vermeiden werden
|
|
|
97
|
+vor dem Beenden des Servers mögliche Einträge in den Queues auf der Festplatte
|
|
|
98
|
+gespeichert und beim Starten des Servers wieder eingelesen. Zum Serialisieren
|
|
|
99
|
+der Queue-Einträge dürfen Sie externe Crates benutzen.
|
|
|
100
|
+
|
|
|
101
|
+Wird der Server gestartet überprüft er somit, ob evtl. alte Zustände auf der
|
|
|
102
|
+Festplatte vorhanden sind und falls nicht, initialisiert er eine leere
|
|
|
103
|
+Auftrags-Queue und erstellt zunächst auch keine Ergebnis-Queue(s).
|
|
|
104
|
+
|
|
|
105
|
+## Fehlerbehandlung
|
|
|
106
|
+
|
|
|
107
|
+Implementieren Sie eine hierarchische Fehlerbehandlung, bei der mögliche Fehler
|
|
|
108
|
+über generische Fehlertypen der jeweiligen Crates an den Server übergeben und
|
|
|
109
|
+dort ausgewertet und behandelt werden. Dazu stellt jede Crate einen(!) eigenen
|
|
|
110
|
+Fehlertypen zu Verfügung.
|
|
|
111
|
+
|
|
|
112
|
+## Dokumentation
|
|
|
113
|
+
|
|
|
114
|
+Erstellen Sie ausführliche Dokumentationen Ihrer Library (Sub-Crates)
|
|
|
115
|
+Funktionen, die exportiert werden, sodass beim Aufruf von **cargo doc** eine
|
|
|
116
|
+aussagekräftige Doku Ihrer API existiert. Schreiben Sie eine eigene 'DESIGN.md'
|
|
|
117
|
+Datei in Markdown Syntax, in welcher Sie das Design Ihres Servers beschreiben
|
|
|
118
|
+(Umfang 1-2 Seiten).
|
|
|
119
|
+
|
|
|
120
|
+## Bibliothek
|
|
|
121
|
+
|
|
|
122
|
+Für den letzten Aufgabenteil dürfen Sie externe Crates benutzen. Ansonsten sind
|
|
|
123
|
+alle bisher in den Laboraufgaben genannten Crates erlaubt. Zum Logging Ihrer
|
|
|
124
|
+Applikation (kann zur Fehlersuche bei komplexeren Programmen hilfreich sein)
|
|
|
125
|
+sind ebenfalls externe Crates erlaubt.
|
|
|
126
|
+
|
|
|
127
|
+## Testabdeckung
|
|
|
128
|
+
|
|
|
129
|
+Achten Sie auf eine ausreichende Testabdeckung, um innerhalb Ihrer Crates alle
|
|
|
130
|
+verwendeten Funktionen zu testen.
|