Not logged in. · Lost password · Register

Forum: Bachelor Softwaresysteme Systemprogrammierung RSS
N kleines tutorial zu sockets
Page:  previous  1  2  3  4  next 
Robert
(Administrator)
Avatar
Member since Nov 2002
559 posts
In reply to post ID 10992
1) Fehlerabfrage für write auf jeden Fall. Schöner wäre es auch wenn du das SIGPIPE abfängst, zB SIG_IGN und danach errno auf EPIPE prüfst, dann terminiert dein Programm auch gescheit.

Arghh, was heisst dass denn jetzt schon wieder. Kannst du das vielleicht noch ein bisschen in Kot umformulieren, vielleicht check ichs dann besser?
Im Moment siehts so bei mir aus

if(write()<0){
 perror("writeerror")
 free(socket)
 exit(-1)
}

Wie mach ich das, was du da oben schreibst?
Ummm, yeah. We couldn't run an ad that said no Portuguese, but ummm... no Portuguese!
Mikey
SP Team
Avatar
Member since Nov 2002
641 posts
das was du geschrieben hast is nur die fehlerabfrage, passt auch wenn du dir den prozess von sigpipe killen lässt.

wenn du für sigpipe mit sigaction das signal ignorierst (SIG_IGN) (>manpage) wirft dein write auch einen fehler, und du kannst prüfen ob errno==EPIPE dann weisst du nämlich dass die pipe geschlossen wurde und kein sonstiger fehjler aufgetreten ist
Steppenwolf
Schläfer
Avatar
Member since Nov 2002
1535 posts
vielen dank,
die 3 punkte sind integriert
und ich glaube, ich schliesse damit den daemon ab...
matthias
Anonymer Informatiker
Member since Oct 2002
398 posts
Mein timed läuft schon ganz gut.

Ich habe jedoch eine kleine Bbesonderheit bei der Behandlung von accept:

Wenn mir ein Client durch eine unterbrochene Terminalverbindung abgurkt (SIGPIPE wird mit SIG_IGN behandelt), läuft das accept mit einem EINTR schief. Vermutlich ein SIGCHLD während dem accept. Soweit so gut.

Mit kreativem Einsatz von if und errno macht das Programm auch so in etwa was es soll.

Tritt bei euch auch ein EINTR auf?
frahi
Avatar
Member since Nov 2002
777 posts
Vielleicht nochmal zur Erklaerung, warum es sinnvoll (aber nicht unbedingt notwendig) ist, das SIGPIPE abzufangen und dann mit exit(EXIT_SUCCESS); zu beenden:
Der Prozess, der diesen beendeten Prozess dann mit waitpid/wait abfaengt bekommt so ueber den Rueckgabewert die Information, dass dieser ordnungsgemaess beendet wurde. Wenn SIGPIPE direkt beendet wuerde da ein Fehlerstatus drinstehen.

Die Sache mit dem unterbrochenen accept ist ganz normal und deshalb muss accept auch neu gestartet werden, wenn accept fehlschlaegt _und_ die errno danach gleich EINTR ist. Unterbrochen wird das durch das SIGCHLD, in dessen Signalhandler ja die terminierten Sohnprozesse aufgesammelt werden sollen.

" free(socket)" ist nicht so ganz richtig, du willst (vermutlich) den socket, also einen filedescriptor schliesen, das geht mit close(socket); . free darf nur auf Pointer angewandt werden, die malloc, realloc oder calloc mal zurueckgeliefert haben.
matthias
Anonymer Informatiker
Member since Oct 2002
398 posts
Man dankt für die Antwort. Ich dachte schon, ich wäre der einzige, dem das passiert ;-)
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
In reply to post #34
Quote by matthias:
Tritt bei euch auch ein EINTR auf?

Aus 'ps':
30824 pts/1    00:00:00 timed
30827 pts/1    00:00:00 timed <defunct>
30830 pts/1    00:00:00 timed <defunct>

Scheinbar nicht. Hätte ich aber auch gerne! Nur leider steht auch in der accept-manpage nix von einem EINTR oder dieser Erscheinung drin. Kann mir jemand verraten, wie man sowas anstellt? Ansonsten werden meine Childprozesse jetzt eben so lange aufgehoben, bis der timed beendet wird.

Update: es bleibt immer nur ein <defunct> Prozess übrig. Alle anderen werden entfernt, soweit vorhanden. Aber erst, wenn eine neue Verbindung aufgebaut wird...
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
This post was edited on 2003-12-29, 15:29 by Yves.
matthias
Anonymer Informatiker
Member since Oct 2002
398 posts
errno wird auf EINTR gesetzt, wenn ein signal während accept komt (unter anderem).

Entspricht defunct einem Zombie?
This post was edited on 2003-12-29, 15:30 by matthias.
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Quote by matthias:
errno wird auf EINTR gesetzt, wenn ein signal während accept komt (unter anderem).
Dafür müsste accept aber auch unterbrochen werden, oder? Und wenn bei mir accept unterbricht ohne ein Socket zu liefern, ist es aus! Da mein timed aber munter weiterläuft, kann bei mir kein EINTR auftreten. </schlussfolgerung>

Entspricht defunct einem Zombie?
Denke schon... wüsste jedenfalls nicht, was es sonst sein soll.
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
juk
Member since Dec 2003
383 posts
Quote by Yves:
Dafür müsste accept aber auch unterbrochen werden, oder? Und wenn bei mir accept unterbricht ohne ein Socket zu liefern, ist es aus! Da mein timed aber munter weiterläuft, kann bei mir kein EINTR auftreten. </schlussfolgerung>
=> es kommen keine Signale rein, waehrend der timed im accept steht.
nachdem es eigentlich nur um SIGCHLD gehen kann, gibts dafuer
zwei Moeglichkeiten
a) es stribt kein Kind (aber was tun die dann????)
b) es gibt keinen Signalhandler fuer SIGCHLD (dann wird's ignoriert und
   fuehrt auch nicht zu Unterbrechungen vom accept)

Nach dir offenbar ZOMBIES uebrig bleiben tippe ich mal auf b)

Entspricht defunct einem Zombie?
Denke schon... wüsste jedenfalls nicht, was es sonst sein soll.
Definitiv ja

Juergen Kleinoeder
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Quote by juk:
b) es gibt keinen Signalhandler fuer SIGCHLD (dann wird's ignoriert und
   fuehrt auch nicht zu Unterbrechungen vom accept)

Hm, wenn das also gleich ignoriert wird, könnte ich gut verstehen, warum ich davon dann nix mitbekomme. Na dann muss ich mich doch mal dran machen, da nen Sighandler für zu definieren...
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
tsunami
skankin´ foot
Avatar
Member since Jan 2003
352 posts
ich schaff es irgendwie nicht, meine timed mit telnet zu testen. Ich hab jetzt mal mit der Funktion 'inet_ntoa()' die internet-Addresse meines gebundenen Sockets s ausgeben lassen - und die is immer 0.0.0.0
ist das normal? wenn ich nämlich dann 'telnet 0.0.0.0' versuche, sagt er mir jedesmal: connection refused
Entweder meine timed is buggy oder ich mach was mit telnet falsch...  :-/
once you had a dream
of oceans, and sunken cities;
memories of things you´ve never known
and you have never known...   (Michael Stipe)
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Quote by tsunami:
und die is immer 0.0.0.0
kann gut sein, wenn du auf allen interfaces (mit allen adressen, die dem PC gehören) lauschst.

ist das normal? wenn ich nämlich dann 'telnet 0.0.0.0' versuche, sagt er mir jedesmal: connection refused
das ist auch normal, du kannst ja schließlich nicht zu allen IPs im internet gleichzeitig verbinden - sowas ähnliches ginge eh anders. nimm doch einfach mal die adresse deines eigenen rechners, oder einfach den namen 'localhost'.
beispiel:

$ timed &
$ netcat -vv localhost 12345    // 12345 ist deine uid
localhost [......] 12345 open
03.01.2004 19:31:24
03.01.2004 19:31:25
03.01.2004 19:31:26
^C
 sent 0, rcvd 60
$

netcat gefällt mir eh besser als telnet, das macht nur eine ganz simple tcp (/udp)-verbindung, nix mit terminal-emulation und so'n zeug.
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
tsunami
skankin´ foot
Avatar
Member since Jan 2003
352 posts
danke... jetzt funzt alles!
Aber kann das sein, dass wenn der Vater alle Zombies aufsammeln soll, ich ja wieder die Jobliste brauch, wieder alle geforkten child-Prozesse eintragen muss und nen child-handler für SIGCHLD brauch? *stöhn*
once you had a dream
of oceans, and sunken cities;
memories of things you´ve never known
and you have never known...   (Michael Stipe)
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Jobliste? Mach doch einfach wait() in ner Schleife, und sag dem, dass er nicht warten soll, falls keiner mehr übrig ist.
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  previous  1  2  3  4  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen