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
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.
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.
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
Evtl. kann man auch nachdenken, auf welches Signal wie reagiert wird.
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.
Probier mal ein "signal(SIGPIPE, SIG_IGN)" irgendwo am Anfang des Programms. Und dann natürlich den Fehlerstatus vom "write" auswerten...
AHA! Mit dem signal gehts! Kenn mich damit noch nicht aus und werde mich in das Signalzeugs einlesen... Vielen Dank!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.