2011-08-04 3 views
4

J'écris une application réseau qui communique via un socket TCP Linux. Récemment, j'ai remarqué que l'appel système s'est écrasé sur mon application. Cela fonctionne bien quand les deux pairs sont en place (je suis en train de tester la récupération après un crash). Mais quand un pair est en panne, le second se bloque en exécutant ce morceau de code. La socket est déjà préparée et connectée et a été exécutée plusieurs fois avant que le deuxième homologue ne tombe en panne. Je m'attendais à ce que ce code retourne la valeur -1, mais il produit en sortie seulement "out_tcp 11" puis l'application se termine. Aucun message d'erreur, aucune valeur renvoyée par l'envoi. Je l'exécute sous Valgrind, il dit que l'application se termine normalement - aucun message d'erreur/d'avertissement.Linux TCP crash de socket

Est-ce que quelqu'un a une idée de comment le déboguer? Outils à utiliser? Je suis bloqué avec ça car je ne reçois aucune information.

Merci à l'avance Harnen

+1

utilisez-vous de signalisation? l'avez-vous vérifié avec 'gdb'? –

+1

Valgrind? Ce n'est pas une fuite de mémoire, exécutez-le sous 'gdb'. Vous risquez de quitter SIG_PIPE. –

+2

duplication possible de [Comment empêcher SIGPIPE ou empêcher le serveur de se terminer?] (Http://stackoverflow.com/questions/6821469/how-to-prevent-sigpipe-or-prevent-the-server-from-ending) –

Répondre

0

Avez-vous essayé de RTFM (lire le manuel) sur les conditions d'erreur? Attrapez-vous ou ignorez-vous des signaux? Qu'en est-il de la variable globale errno?

man send 

Et aussi TCP est un protocole de diffusion en continu, il est donc recommandé d'utiliser les commandes d'accès habituelles en streaming comme lecture(), write() si vous ne avez pas besoin de drapeaux spéciaux.

+0

Je l'ai fait. C'est un peu difficile de faire quoi que ce soit (vérifiez errno) quand l'envoi ne revient pas et l'application se termine ... – harnen

1

SOLVED: UTILISATION MSG_EOR, MSG_NOSIGNALflag en fonction d'envoi comme ci-dessous

if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1) 

Hope it helps