Aufgabe 6

N kleines tutorial zu sockets

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 6
Ich post hier mal die url wenn ihr das alles schon wisst/könnt könnt ihrs ja ignorieren ich jedenfalls fands hilfreich

http://www.ecst.csuchico.edu/~beej/guide/net/


im prinzip ist die aufgabe ähnlich wie die Aufgabe 3 aus OTRS3 … nur kein Java, keine Threads und mehr Fehlerbehandlung :slight_smile:


juhu dann kann ich also endlich sagen dass ich ne OTRS3 aufgabe gemacht hab :smiley:


wann terminiert ihr eure prozesse eigentlich?
im moment is bei mir überall noch ne endlosschleife drin.


nicht dass ich etwa schon damit angefangen hätte… :wink:
aber ^C wird das programm schon auch beenden dann. wie sonst willst du einen blockierten prozess was prüfen lassen? tasten oder so? dann müsstest du die funktionen alle non-blocking verwenden und ich weiß net, ob das so viel spaß macht… grad mit aktivem warten und so.


also das telnet stürzt ab nach einem STRG^C und wer hat den gesagt das blockierte deamons nicht trotzdem ohne signal beendet werden können?
man denke z.B. an eine while(read != EOF) oder so


ach, im hintergrund soll das ganze laufen? (sorry, hab die aufgabe noch net angeschaut)
na dann kannst du z.b. ein spezielles quit-kommando einbauen, ein einfaches protokoll etwa. oder ‘kill ’ oder sowas. oder du wertest EOF aus, kannst dann aber nur eine feste anzahl verbindungen oder so annehmen…


ich weiß jetzt nicht genau wie die Aufgabe eigentlich lautet, aber terminieren?

bind
listen
while(1) {
accept
if(fork == 0) {
while(write(zeit) != -1) {
sleep
}
close(connection)
exit
}
tote_kinder_sammeln_sich_damit_aber_nicht_aufhalten()
}
close(socket)

dazwischen noch irgendwo ein geblocktes sigpipe und fertig, oder so ähnlich? Vielleicht auch das listen noch in die Schleife rein. Ich weiß nicht mehr genau wie das ging. Eben genau so wie in der OTRS aufgabe g

Strg-C terminiert das Programm. Die Kinder beenden sich dann ebenfalls. Ein Kind beendet sich auch, wenn write fehlschlägt und somit kein telnet mehr am socket horchen tut …

Grüße,
Sebbi


satrg-c terminiert aber leidr nicht meine telnet-sitzung.
ich hab allerdings auch kein sig-handling für die cildprozessse eingebaut.
meinst du das mit sigpipe?


was meinst du denn damit?

bist du dir da sicher, dass das so gehen soll (strg-c als einziges programmende)? kann das vielleicht noch eine „autorisierte person“ bestaetigen?


die telnet-sitzung terminierst du mit strg-] bzw. str-+ auf der deutschen tastatur. dann kommst du zum "telnet> "-prompt, welches du mit „quit“ beendest.


das is ja schonmal was, danke.
jetzt is nur die frage obs den childprozess der sie socketverbindung mit dem datum zuspammt auch gekillt wird wenn die verbindung verloren geht. das würde ich jetzt mal intuitiv verneinen. fällt ja auch kaum auf wenn n paar dutzend prozesse die sockets zulabern. gibt ja genug prozesse die ich starten darf. und wenn ich den deamon mit strg-c kille hauts auch die kinder raus.
geht also schon, und mehr is ja auch nicht verlangt laut aufgabenstellung.

frahi?


erstmal: ihr könnt mein binary aus wwwcip.informatik.uni-erlangen.de/~simistil benutzen um zu sehen wie sich das Programm verhalten soll

  1. terminieren soll es nie (CTRL+C wird es dann aber terminieren)

  2. die Kinder sollen selbstverständlich sterben wenn die Verbindung geschlossen wird. Im Endeffekt wird euer write dann einen Fehler schmeissen.

  3. der Vater soll die Zombies auch auflesen

  4. die Ausgabe der Hostnamen die sich verbinden wie in meinem binary ist optional, euer timed muss eigentlich gar nix ausgeben


Aus der Manpage von write (man 2 write):

[b]ERRORS[/b]
       [b]EPIPE[/b]  fd is connected to a pipe or socket whose reading end is closed.  When
              this  happens  the writing process will also receive a SIGPIPE signal.
              (Thus, the write return value is seen only  if  the  program  catches,
              blocks or ignores this signal.)

Heißt also, dass write den EPIPE-Fehler nur zurückgibt, wenn man SIGPIPE blockt, fängt oder ignoriert, da sonst write selbst durch das Signal unterbrochen wird. (man möge mich korrigieren, wenn ich falsch liege) Probier mal aus, ob es auch ohne geht … hatte das bei mir jedenfalls letztes Jahr aus irgendeinem Grund eingebaut :slight_smile:

Letzteres wurde ja von offizieller Stelle bestätigt G

Grüße,
Sebbi

P.S.: Hab noch das Auflesen der Kinder in den Pseudocode eingefügt :slight_smile:


default Aktion bei SIGPIPE: Prozess wird terminiert

also das Kind stirbt → was will man mehr ?

Mal was anderes…
Wenn ich meinen Dämon testen mag, versuche ich das so:

telnet localhost:280**

Aber irgendwie will das nicht, ist mein Dämon kaputt oder muss ich beim telnet noch irgendwelche parameter mitschicken?


telnet localhost 14873


:cheesy:

Cool, mein Dämon geht, danke für die fixe Antwort!


Kann mir das mit dem Sigpipe vielleicht nochmal jmd erklären, ohne dabei mit haufenweise Linux Begriffen um sich zu schmeissen?
Mein Dämon hört jetzt halt auf, wenn das write() einen Fehler schmeisst, aber was hat das mit SigPipe zu tun?