Aufgabe 4:
Lernziel
- Verständnis für die Socket-Programmierung mit UDP/IP
- Verständnis von SUN-RPC
Aufgabenbeschreibung
Im Rahmen der vierten praktischen Aufgabe soll der bisher implementierte
Kommandointerpreter um die internen Kommandos tftp
und
rwho
erweitert werden.
bsshell> tftp [-p port] 〈host-ip〉 〈put | get〉 〈filename〉
bsshell> rwho
Das Kommando tftp
soll einen TFTP-Client (trival file
transfer protokol) umsetzen. Dabei handelt es sich wie der Name schon sagt,
um ein sehr einfaches Protokoll zur Übertragung von Dateien.
Die Übertragung kann entweder vom Client zum Server (write) oder
vom Server zum Client (read) erfolgen.
Die besondere Schwierigkeit bei der Realisierung eines TFTP-Clients liegt
darin, dass für die Kommunikation UDP/IP,
das heißt datagrambasierte Kommunikation, verwendet wird.
UDP/IP ist verbindungslos, so können Pakete:
- duplieziert werden,
- in der Reihenfolge vertauscht oder
- komplett verlohren gehen.
Auf diese Fehlverhalten bei der Übertragung muss der Client
entsprechend der Vorgaben des TFTP-Protokolls reagieren.
Dazu ist mit timeouts
und retransmissions
zu arbeiten.
Die Umsetzung des Kommandos 'rwho'
soll mit Hilfe von
SUN-RPCs erfolgen.
Dazu gehört ein RPC basierter Server, der auf einem vorher festgelegtem
Rechner (IP-Addresse) laufen soll und einem Client, der von
unserem Kommandointerpreter dargestellt wird.
Der Server soll die folgenden Funktionen anbieten:
- anmelden: Beim Anmelden identifiziert sich ein Benutzer mit seinem Namen beim Server. Neben dem Benutzernamen sollte eine IP-Addresse zur Identifikation des Rechners des Benutzers angegeben werden. Als Resultat des Aufrufs erhält der Client eine Benutzer-ID, die für weiteren Aufrufe verwendet werden kann, um den Aufrufer zu identifizieren.
- abmelden: Dient dazu, einen Benutzer vom Server abzumelden. Dies geschieht dann, wenn der Benutzer den Kommanandointerpreter beendet.
-
status: Mit dieser Anfrage ist der Benutzer eines Clients
in der Lage abzufragen, wieviele und welche anderen Benutzer gerade online
(am Server angemeldet) sind. Eine Benutzung dieser Anfrage als
'rwho'
Kommando setzt vorraus, das sich ein Benutzer beim Start des Kommandointerpreters automatisch beim Server anmelden muss.
Unsinnige Aufrufe sollen in den Serverfunktionen durch Plausibilittstests erkannt und mit entsprechenden Fehlercodes zurückgewiesen werden.
Implementierungshinweise
- Teil A
-
Zuerst solltet ihr damit beginnen den TFTP-Client als eigenständiges
Program zu implementieren. Danach könnt ihr den Client als Kommando
'tftp'
in den Komanndointerpreter integrieren.
Hinweis: Testen könnt ihr euren TFTP-Client mit einem normalen TFTP-Server zusammen mit unserem TFTP-Proxy. Der TFTP-Proxy wird zwischen Client und Server der TFTP-Verbindung geschaltet und dient dazu Fehler, die euer Client abfangen soll, in die Verbindung einzuschleusen.
Weitere Infos:socket(2)
,connect(2)
,select(2)
,recvfrom(2) und
sendto(2)
- Teil B
-
Bei der Umsetzung des Kommandos
'rwho'
solltet ihr wie bei der Umsetzung des Kommandos'tftp'
vorgehen: "Zuerst den Client und Server als eigenständige Programme implementieren und danach den Client als entsprechendes Kommando in den Interpreter integrieren.
Hinweis: Hinweise zur Implementierung eines SUN-RPC basierten Client/Servers könnt ihr der folgenden Beschreibung entnehmen.
Weitere Infos:rpcgen(1)
Vorgabe
Da die Aufgabe nur den Funktionsumfang nicht aber die Schnittstelle des Kommandointerpreters erweitert, gibt es zu dieser Aufgabe keine Vorgabe.
Hilfestellung
- TFTP-Protokoll (Wikipedia.org)
- TFTP-Beschreibung (RFC 1350)
- RPC Definition (Wikipedia.org)
- RPC Protokoll Spezifikation (RFC 1057)
- SUN-RPC Beschreibung