Forum: PC-Programmierung C++ Socket programmierung: Programm bricht bei write ab


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreibe an einer Applikation in C++ für ein embedded Linux 
Gerätchen. Es verbindet sich mit einem Netzwerksocket zu einem Server um 
Daten zu versenden. Beim Aufruf der Funktion

write(sockfd, temp.c_str(), temp.length())

beendet sich das Programm unmotiviert, wenn der Socket vom Server 
geschlossen wurde. Ich habe um das write einen try-catch Block, aber 
trotzdem ist einfach Schluss.

Hat jemand einen Tip?

Stefan

von Jay (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Hat jemand einen Tip?

Ja, beim verwenden von C-APIs, auch in C++, Fehlerbehandlungen nach C 
Art und Weise des APIs, nicht nach C++ Art und Weise implementieren.

>> Return Value
>>
>> On success, the number of bytes written is returned (zero indicates
>> nothing was written). On error, -1 is returned, and errno is set
>> appropriately.
>>
>> If count is zero and fd refers to a regular file, then write() may
>> return a failure status if one of the errors below is detected. If no
>> errors are detected, 0 will be returned without causing any other
>> effect. If count is zero and fd refers to a file other than a regular
>> file, the results are not specified.

von Stefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok, danke, werde ich so umbauen, allerdings ist das Kernproblem 
unabhängig davon, dass das Programm sich einfach beendet wenn der Socket 
vom Server geschlossen wurde.

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Ok, danke, werde ich so umbauen, allerdings ist das Kernproblem
> unabhängig davon, dass das Programm sich einfach beendet wenn der Socket
> vom Server geschlossen wurde.

dann hast du woanders noch einen Fehler, write kann nicht dafür sorgen 
das das Programm beendet

von Klaus W. (mfgkw)


Bewertung
0 lesenswert
nicht lesenswert
Evtl. kann man auch nachdenken, auf welches Signal wie reagiert wird.

von Udo S. (urschmitt)


Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> dann hast du woanders noch einen Fehler, write kann nicht dafür sorgen
> das das Programm beendet

Die Frage ist wie gut ist der Protokoll Stack. Bei Windows und Linux 
würde ich sagen kann so ein Fehler nicht passieren, bei einem Embedded 
Linux, das mit der heissen Nadel für irgendeine neue Hardware gestrickt 
wurde, würde ich das nicht ausschliessen.

von asdfasd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Probier mal ein "signal(SIGPIPE, SIG_IGN)" irgendwo am Anfang des 
Programms.  Und dann natürlich den Fehlerstatus vom "write" auswerten...

von Stefan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
AHA!

Mit dem signal gehts! Kenn mich damit noch nicht aus und werde mich in 
das Signalzeugs einlesen...

Vielen Dank!

von Udo S. (urschmitt)


Bewertung
0 lesenswert
nicht lesenswert
asdfasd schrieb:
> Probier mal ein "signal(SIGPIPE, SIG_IGN)" irgendwo am Anfang des
> Programms.

Mist das ist schon zu lange her. Klar in UnixLinux gibts ein Broken Pipe 
signal.

Du kannst auch beim send das Flag "MSG_NOSIGNAL" mitgeben. Das ist dann 
nicht mit der großen Keule wie bei "signal(SIGPIPE, SIG_IGN)"

Kurz gesucht:
http://linux.die.net/man/2/send

von Daniel A. (daniel-a)


Bewertung
0 lesenswert
nicht lesenswert
Bei mir war zusätzlich zu
signal(SIGPIPE, SIG_IGN)
noch folgendes nötig:

sockfd prüfen:
#ifdef INVALID_SOCKET
#define SOCKET_VALID(S) (S!=INVALID_SOCKET)
#else
#define SOCKET_VALID(S) (S>=0)
#endif

Und mit select warten, bis sockfd writable ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.