Question

Je l'ai testé le même TestCode (Serveur - Client) sur deux systèmes. Dans celui que je reçois un SIGPIPE, dans un autre, je ne reçois pas SIGPIPE.

Le scénario de test est quelque chose comme ci-dessous:

Client

  1. Se connecter à un serveur
  2. Recevoir des données à partir du serveur
  3. Envoyer des données
  4. Fermer le socket

Serveur

  1. Accepter la connexion d'un serveur
  2. Envoyer des données au client
  3. Réception de données
  4. Envoyer des données
  5. Fermer le socket

Dans un système (client et serveur en cours d'exécution sur le même système), SIGPIPE se passe au hasard sur le côté client ou serveur.

Mais, dans un autre système, ce problème ne se produit pas avec le même code de test.

Je me demande si tuyau cassé a quelque chose à voir avec les paramètres TCP.

Était-ce utile?

La solution

Vous pouvez également ignorer SIGPIPE de la prise de plantage de l'application EMPÊCHER ce code:

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

Où sd est prise où vous recevoir SIGPIPEs.

Autres conseils

Le signal SIGPIPE est élevé si vous essayez d'écrire sur un socket que l'autre extrémité a déjà fermé. Il y a une condition de course ici, si une extrémité ferme la prise dans le même temps que les autres tentatives de fin d'envoyer des données - la notification à proximité peut être reçue avant ou après l'envoi, ce qui explique pourquoi la SIGPIPE est INTERVENUES dans un environnement de test et pas l'autre.

applications Généralement, sensibles au socket doivent ignorer SIGPIPE, et au lieu de traiter de manière synchrone l'erreur de EPIPE résultant de send().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top