Question

je sais que l'erreur de conduite brisée est levée lorsque la prise sur le côté homologue est fermé.

Mais, dans mon test, je l'ai noté qu'un appel « send » immédiat de ce côté lorsque le côté homologue est fermé ne conduit pas toujours à une erreur de conduite brisée.

par exemple:.

Après la fermeture de la prise sur le côté par les pairs (je l'ai essayé refermable propre en appelant près et aussi la fermeture anormale en tuant les pairs), si je tente d'envoyer 40 octets, alors je ne suis pas un tuyau cassé, mais si J'essaie d'envoyer 40000 octets alors il donne immédiatement l'erreur de conduite brisée.

Quelles sont les causes exactement tuyau cassé et peut-il prévoir de comportement?

Était-ce utile?

La solution

Il peut prendre du temps pour le réseau à proximité d'observer - le temps total est nominalement environ 2 minutes (oui, minutes!) Après une fin avant que les paquets destinés au port sont tous supposés être morts. La condition d'erreur est détectée à un moment donné. Avec une petite écriture, vous êtes à l'intérieur du MTU du système, de sorte que le message est mis en attente pour l'envoi. Avec une grande écriture, vous êtes plus grand que le MTU et le système SPOTS le problème plus rapidement. Si vous ignorez le signal SIGPIPE, les fonctions renverra l'erreur EPIPE sur un tuyau cassé -. À un moment où la ness brisée de la connexion est détectée

Autres conseils

L'état actuel de la douille est déterminée par l'activité 'de maintien en activité. Dans votre cas, cela est possible que lorsque vous émettez l'appel send, l'activité keep-alive indique que la prise est active et si l'appel send rédigera les données requises (40 octets) dans la mémoire tampon et retourne sans donner aucune erreur.

Lorsque vous envoyez un plus gros morceau, l'appel d'envoi va dans l'état de blocage.

La page Envoyer homme confirme également ceci:

  

Lorsque le message ne correspond pas à la mémoire tampon d'envoi de la douille, send () bloque normalement, à moins que la douille a été placé en mode d'E / S non-bloquant. En mode non-bloquant retournerait EAGAIN dans ce cas

Ainsi, tout en bloquant pour le tampon disponible gratuitement, si l'appelant est informé (par le mécanisme de keep-alive) que l'autre extrémité est plus présent, l'appel d'envoi échouera.

Prédire le scénario exact est difficile avec les informations mentionnées, mais je crois, cela devrait être le problème raison pour vous.

Peut-être que les 40 octets se insère dans la mémoire tampon de tuyau, et les 40000 octets ne fonctionne pas?

Edit:

Le processus d'envoi est envoyé un signal SIGPIPE lorsque vous essayez d'écrire dans un tube fermé. Je ne sais pas exactement quand le signal est envoyé, ou quel effet le tampon de conduite a sur ce point. Vous pouvez être en mesure de récupérer en piégeant le signal avec l'appel sigaction.

Quand près des pairs, vous ne savez pas si elle cesse simplement d'envoyer ou l'envoi et receiving.Because TCP permet, d'ailleurs, vous devez connaître la différence entre proximité et l'arrêt. Si les pairs à la fois arrêter l'envoi et la réception, d'abord vous envoyer quelques octets, il réussira. Mais le noyau de pairs vous envoie RST. Donc, par la suite vous envoyez quelques octets, votre noyau vous enverra le signal SIGPIPE, si vous attrapez ou ignorer ce signal, lorsque votre envoi des retours, il vous suffit obtenir erreur Broken pipe, ou si vous ne le faites pas, le comportement par défaut de votre programme crashe .

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