Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 17. Nov 2018 5:15

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 25. Apr 2010 18:51 
Offline

Registriert: 14. Mai 2007 19:27
Beiträge: 70
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
8) pcAlko


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 26. Apr 2010 21:49 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 02. Mai 2010 18:59 
Offline

Registriert: 14. Mai 2007 19:27
Beiträge: 70
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 02. Mai 2010 22:28 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
Zitat:
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 04. Mai 2010 18:36 
Offline

Registriert: 14. Mai 2007 19:27
Beiträge: 70
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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de