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


von Stefan (Gast)


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)


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)


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)


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)


Lesenswert?

Evtl. kann man auch nachdenken, auf welches Signal wie reagiert wird.

von Udo S. (urschmitt)


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)


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)


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)


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)


Lesenswert?

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

sockfd prüfen:
1
#ifdef INVALID_SOCKET
2
#define SOCKET_VALID(S) (S!=INVALID_SOCKET)
3
#else
4
#define SOCKET_VALID(S) (S>=0)
5
#endif

Und mit select warten, bis sockfd writable ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.