Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
flush() problem wenn Client Communikation abbricht

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pcAlko



Anmeldungsdatum: 14.05.2007
Beiträge: 70

BeitragVerfasst am: 25. Apr 2010 18:51   Titel: flush() problem wenn Client Communikation abbricht

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:

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
Cool pcAlko
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 26. Apr 2010 21:49   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

pcAlko



Anmeldungsdatum: 14.05.2007
Beiträge: 70

BeitragVerfasst am: 02. Mai 2010 18:59   Titel:

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.

Cool pcAlko
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 02. Mai 2010 22:28   Titel:

pcAlko hat folgendes geschrieben::

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

pcAlko



Anmeldungsdatum: 14.05.2007
Beiträge: 70

BeitragVerfasst am: 04. Mai 2010 18:36   Titel:

ja zum Beispiel "kabel gezogen"
oder Client wurde nicht sauber programmiert
in meinem Fall war zwar ich der Übeltäter der den Cleint programmierte Embarassed
aber das Projekt soll ja mal Open Source werden
(bzw. ist es ja schon, bis auf dass nur ich dran programmiere Rolling Eyes )
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

Cool pcAlko
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy