web-dev-qa-db-fra.com

Quelle est la différence entre les délais de connexion et de lecture des sockets?

3 questions:

  1. Quelle est la différence entre connexion et lecture délai d'attente pour les sockets?

  2. Que signifie connection timeout sur "infinity"? Dans quelle situation peut-il rester dans une boucle infinitive? et qu'est-ce qui peut déclencher que la boucle d'infini meurt?

  3. Que signifie lire timeout sur "infinity"? Dans quelle situation peut-il rester dans une boucle infinitive? et qu'est-ce qui peut déclencher que la boucle d'infini meurt?

156
corgrath

1) Quelle est la différence entre les délais de connexion et de lecture pour les sockets?

Le délai de connexion est le délai d’établissement de la connexion initiale; c’est-à-dire l’achèvement de la connexion TCP). Le délai de lecture correspond au délai d’attente pour lire les données1. Plus précisément, si le serveur ne parvient pas à envoyer un octet <délai d'attente> secondes après le dernier octet, une erreur de délai d'attente de lecture sera générée.

2) Que signifie le délai de connexion défini sur "infini"? Dans quelle situation peut-il rester dans une boucle infinitive? et qu'est-ce qui peut déclencher que la boucle d'infini meurt?

Cela signifie que la tentative de connexion peut potentiellement bloquer pour toujours. Il n'y a pas de boucle infinie, mais la tentative de connexion peut être débloquée par un autre thread qui ferme le socket. (Un appel Thread.interrupt() peut également faire l'affaire ... pas sûr.)

3) Que signifie le délai de lecture défini sur "infini"? Dans quelle situation peut-il rester dans une boucle infinie? Qu'est-ce qui peut déclencher la fin de la boucle infinie?

Cela signifie qu'un appel à read sur le flux de socket peut bloquer à tout jamais. Une fois encore, il n’ya pas de boucle infinie, mais le read peut être débloqué par un appel Thread.interrupt(), fermant le socket et (bien sûr) l’autre extrémité envoyant des données ou fermant la connexion.


1 - Ce n'est pas ... comme le pensait un intervenant ... le délai d'attente pendant lequel un socket peut être ouvert ou inactif.

190
Stephen C

Il s’agit de valeurs de délai d’application appliquées par la machine virtuelle Java pour l’établissement de la connexion TCP) et en attente de lecture des données à partir du socket.

Si la valeur est définie à l'infini, vous n'attendrez pas pour toujours. Cela signifie simplement que JVM n'a pas de délai d'expiration et que le système d'exploitation sera responsable de tous les dépassements de délai. Cependant, les délais d'attente sur le système d'exploitation peuvent être très longs. Sur certains réseaux lents, j'ai constaté des délais d'attente pouvant aller jusqu'à 6 minutes.

Même si vous définissez la valeur de délai d'attente pour socket, il se peut que cela ne fonctionne pas si le délai d'attente se produit dans le code natif. Nous pouvons reproduire le problème sous Linux en nous connectant à un hôte bloqué par un pare-feu ou en débranchant le câble du commutateur.

La seule approche sûre à prendre en main TCP timeout) consiste à exécuter le code de connexion dans un autre thread et à interrompre le thread lorsque le processus est trop long.

7
ZZ Coder