================================ Einrichten eines Netzwerkdiensts [TOC] ================================ Das Anbieten eines Netzwerkdiensts und dessen Annahme kann von dem eigentlichen Netzdienst getrennt werden. Ein Werkzeug, das diese Idee umsetzt ist _tcpserver_ von Dan Bernstein, der hierzu eine Schnittstelle entwickelte mit dem Namen UCSPI entwickelte: https://cr.yp.to/proto/ucspi.txt _tcpserver_ erhält als Parameter eine Netzwerkadresse einschließlich einer Portnummer und ein beliebiges Kommando. Für jede neue Verbindung wird das Kommando frisch gestartet, wobei die Standard-Ein- und Ausgabe mit der Netzwerkverbindung verbunden sind. Das Kommando ist mitsamt seinen umfangreichen Optionen hier beschrieben: https://cr.yp.to/ucspi-tcp/tcpserver.html Hier ist ein Beispiel: ---- SHELL (path=session05,hostname=theon) ---- tcpserver 0 22045 date & echo $! >service.pid telnet 127.0.0.1 22045 kill $(cat service.pid) && rm -f service.pid ----------------------------------------------- Wenn „0“ angegeben wird, dann werden alle verfügbaren lokalen Adressen verwendet (einschließlich _localhost_ = 127.0.0.1). Die Portnummer ist hier 22045. Wenn die Portnummer bereits verwendet wird, gibt es eine Fehlermeldung: ---- SHELL (path=session05,hostname=theon) ---- tcpserver 0 22046 date & echo $! >service.pid tcpserver 0 22046 date kill $(cat service.pid) && rm -f service.pid ----------------------------------------------- Welche Netzwerkverbindung ein Prozess hat, können Sie mit _lsof_ (list open files) ermitteln: ---- SHELL (path=session05,hostname=theon) ---- tcpserver 0 22047 date & echo $! >service.pid lsof -p $(cat service.pid) kill $(cat service.pid) && rm -f service.pid ----------------------------------------------- Der Status „LISTEN“ bedeutet hier, dass Verbindungen akzeptiert werden. Die „*:22045“ gibt die Adresse an, wobei „*“ der 0 bei _tcpserver_ entspricht, d.h. pauschal alle verfügbaren Adressen einschließt. Die Nummer hinter dem Doppelpunkt spezifiziert die Portnummer. Die Wahl der Portnummer kann auch dem System überlassen werden, wenn hier ebenfalls eine 0 angegeben wird: ---- SHELL (path=session05,hostname=theon) ---- tcpserver 0 0 date & echo $! >service.pid lsof -p $(cat service.pid) kill $(cat service.pid) && rm -f service.pid ----------------------------------------------- Aufgabe ======= * Verfolgen Sie mit den Werkzeugen _truss_ (unter Solaris) oder _strace_ (unter Linux) die Systemaufrufe von _tcpserver_. Mit welchem Systemaufruf wird gewartet? Um was handelt es sich bei dem ersten Parameter? Welche Systemaufrufe werden auf dieses Objekt zuvor ausgeführt? * Schreiben Sie mit _tcpserver_ einen kleinen Netzwerkdienst, der die IP-Adresse des Klienten zurückgibt. Dies ist möglich mit Hilfe einer der Umgebungsvariablen, die in der UCSPI-Schnittstelle dokumentiert ist. Was kann sonst noch alles über die Gegenseite ermittelt werden? Kann _tcpserver_ dazu überredet werden, noch mehr zu ermitteln? :navigate: up -> doc:index back -> doc:session05/page02 next -> doc:session05/page04