title image


Smiley Re: Es kommt ein kleiner inetd - Deamon
Hi!Es ist für inetd nicht nötig, eine Endlosschleife zu verwenden. Ich empfehle Dir sogar das nicht zu tun, da für jeden Verbindungsaufbau ein neuer Prozess gestartet wird. Dieser würde so niemals endet. (Der Eintrag "wait" in inetd.conf" läßt inetd nur warten, bis der Dämon beendet ist bevor neue Verbindunge möglich sind und heißt nicht, dass der schon laufende Prozess wiederverwendet wird!)Einen kleinen Server zu schreiben ist sogar kinderleicht!! inetd nimmt die Ausgabe eines Programmes und schickt diese an das Remote-Programm. Als Eingabe für mein kleines Serverprogramm dient die Ausgabe des Remote-Programmes. Also ist das ein kleines Serverprogramm:#include document.write("<");document.write(";");stdio.hdocument.write(">");document.write(";"); int main(int argc, char** argv){ printf("Hello World!"); return 0;}Mit folgendem Eintrag in /etc/inetd.conf kann das compilierte Programm ausgetestet werden: pop2 stream tcp nowait root /usr/local/bin/hello_world hello_worldnach dem Neustart ist auf Port pop2 dann mittels telnet folgendes zu lesen: "Hello World!". (Verwendet wurde: telnet localhost pop2)Auch ein einfaches Shellskript kann so als Server-Daemon fungieren. Leider ist es so, vor allem bei Shell-Skripten, dass die Ausgabe erst nach der kompletten Eingabe erfolgt, also nicht wirklich interaktiv. Das hängt mit dem Puffern des Ausgabestromes zusammen. Erst wenn der Puffer voll ist oder geschlossen wird, wird er geschrieben. Dieses Feature zur Beshleunigung kann so aber sehr stören! In Perl, C/C++, tcl/tk kann man sich damit behelfen, dass man für die Ausgabe den "unbuffered" Modus verwendet, oder den Ausgabe-Puffer nach jedem "printf" Befehlt sofort leert (und damit ausgibt!). In C/C++ geht das z.B. mit fflush(stdin);. Ein kleines interaktives Server-Programm könnte also aussehen:#include document.write("<");document.write(";");stdio.hdocument.write(">");document.write(";"); int main(int argc, char* argv){ char chr;  printf("Hi Niki!\n"); printf("Test Test Test Test Test Test\nBitte gib einen Buchstaben ein:\n"); fflush(stdout); scanf("%c",&chr); printf("\nEingabe war: %c\n", chr); printf("ENDE\n"); return 0;}Im C-Programm wird durch fflush die Ausgabe erzwungen.In perl kann ich folgendermaßen den "unbufferd"-Modus wählen: select(STDOUT); $| = 1; # make unbufferedoder wenn man den objektorientierten Ansatz bevorzugt: use IO::Handle; STDERR->autoflush(1);Für die Shell habe ich auf die Schnelle nichts derartiges gefunden. Wenn jemand so was findet, bin ich daran interessiert!!So einfach kann es also sein einen Daemon zu schreiben. Ciao    Niki

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: