Quelle est la meilleure pratique pour éviter le crash ici?
Soit désactiver les sigpipes comme pour tout le monde, soit intercepter et ignorer l'erreur.
Existe-t-il un moyen de vérifier si l'autre côté de la ligne lit toujours?
Oui, utilisez select ().
select () ne semble pas fonctionner ici car il dit toujours que le socket est accessible en écriture.
Vous devez sélectionner les bits de lecture . Vous pouvez probablement ignorer les bits d' écriture .
Lorsque l'extrémité distante ferme son descripteur de fichier, sélectionnez vous indiquera que des données sont prêtes à être lues. Lorsque vous allez lire cela, vous récupérerez 0 octet, c'est ainsi que le système d'exploitation vous indique que le descripteur de fichier a été fermé.
La seule fois où vous ne pouvez pas ignorer les bits d'écriture, c'est si vous envoyez de gros volumes et qu'il y a un risque que l'autre extrémité soit en retard, ce qui peut entraîner le remplissage de vos tampons. Si cela se produit, alors essayer d'écrire dans le descripteur de fichier peut entraîner le blocage ou l'échec de votre programme / thread. Tester select avant l'écriture vous protégera de cela, mais cela ne garantit pas que l'autre extrémité est saine ou que vos données vont arriver.
Notez que vous pouvez obtenir un sigpipe à partir de close (), ainsi que lorsque vous écrivez.
Fermer vide toutes les données mises en mémoire tampon. Si l'autre extrémité a déjà été fermée, la fermeture échouera et vous recevrez un sigpipe.
Si vous utilisez TCPIP en mémoire tampon, une écriture réussie signifie simplement que vos données ont été mises en file d'attente pour l'envoi, cela ne signifie pas qu'elles ont été envoyées. Tant que vous n'avez pas réussi à appeler close, vous ne savez pas que vos données ont été envoyées.
Sigpipe vous dit que quelque chose s'est mal passé, il ne vous dit pas quoi ou ce que vous devez faire à ce sujet.