flush() problem wenn Client Communikation abbricht

Post Reply
Message
Author
pcAlko
Posts: 70
Joined: 14. May 2007 19:27

flush() problem wenn Client Communikation abbricht

#1 Post by pcAlko »

Hallo Community!

Mein Problem liegt, wie schon im Titel angedeutet, beim übermitteln eines Strings vom Server zum Client wenn die Verbindung schon abgebrochen ist und ich ein flush ausführe.

Code: Select all

FILE* pFile;

[...]
fputs("send something\n", pFile);
if(!ferror(pFile) && !feof(pFile))
    fflush(pFile);
[...]
eben da, wenn der Client zuvor schon die Verbindung abgebrochen hat
nützt auch die Abfrage auf error und end of file nichts mehr
und das Programm endet bei flush.
Solange der Client die Verbindung aufrecht erhält ist alles OK.

hat irgend jemand eine Idee wie ich den Fehler abfangen könnte!?
Vielen Dank
8) pcAlko

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Grundsätzlich ist stdio für Interprozesskommunikation wenig geeignet, weil man damit nicht alle Fehlermöglichkeiten abfangen kann, die dabei auftreten können.

Der Prozess wird mit SIGPIPE beendet, wenn du in eine nicht mehr existierende Pipe schreibst. Du kannst dies abfragen, indem du einen Handler für SIGPIPE installierst.

man 2 signal
man 2 sigaction

Alternativ kannst du das SIgnal auch ignorieren. Dann kannst du die Fehlersituation aber nur erkennen, wenn du statt stdio die Unix-Funktionen write() und read() verwendest. Die liefern dann den Fehler EPIPE in errno zurück.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

pcAlko
Posts: 70
Joined: 14. May 2007 19:27

#3 Post by pcAlko »

Hallo Janka,

Danke für die Antwort!
Bin erst jetzt dazu gekommen dies zu testen.

Nach meiner Änderung, ich habe SIGPIPE vorerst nicht unterdrückt,
ist mir aber aufgefallen dass ich jetzt gar keinen Fehler mehr bekomme.
nicht beim schreiben mit write oder lesen mit read.

habe natürlich die funktion fdopen() gelöscht.
Die kommunikation funktioniert zwar,
bekomme jedoch nach Abbruch vom Client keinen Fehler oder SIGPIPE.
mach ich da jetzt irgendetwas falsch
oder soll ich besser bei fputs() mit fflush() bleiben und nur das Signal SIGPIPE unterdrücken?
Dann krieg ich zwar keinen Fehler beim schreiben,
aber beim Lesen zeigt mir feof() das Ende des Streams an -> Also zb. Abbruch.

8) pcAlko

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

pcAlko wrote: bekomme jedoch nach Abbruch vom Client keinen Fehler oder SIGPIPE.
*Wie* bricht der Client denn ab? Falls es sich um eine Netzwerkverbindung handelt und der Client dem Server nicht sauber "Ich beende die Verbindung meinerseits" signalisieren kann (mittendrin Kabel gezogen oder sowas), läuft da erstmal ein sehr langes Timeout, bevor der Server-Prozess von seinem OS mitgeteilt bekommt, dass er diese Verbindung vergessen kann.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

pcAlko
Posts: 70
Joined: 14. May 2007 19:27

#5 Post by pcAlko »

ja zum Beispiel "kabel gezogen"
oder Client wurde nicht sauber programmiert
in meinem Fall war zwar ich der Übeltäter der den Cleint programmierte :oops:
aber das Projekt soll ja mal Open Source werden
(bzw. ist es ja schon, bis auf dass nur ich dran programmiere :roll: )
und dann kann ich nicht sagen wer den Client Programmiert.
Somit wäre es dann doch etwas Blöd wenn der Server beim Abbruch stirbt, oder den Abbruch gar nicht mitbekommt.

Ich habe es jetzt so gelöst dass ich bei fputs() und feof() mit fgets() bleibe und das SIGPIPE unterdrücke.
funktioniert super, DANKE

8) pcAlko

Post Reply