2017-10-13 3 views
1

J'ai une confusion sur la façon dont le ReadTimeout est utilisé et comment cela affecte Read().NetworkStream: ReadTimeout et son effet Read()

Lorsque vous essayez de lire le flux de réseau, il y a 3 scénarios, en supposant que nous essayons de lire un nombre X d'octets:

  1. Les données sont disponibles, et d'octets de données < X
  2. est disponible, et octets = X
  3. Les données sont disponibles, et d'octets> X
  4. Aucune donnée disponible et ReadTimeout> 0
  5. Aucune donnée disponible, et ReadTimeout = 0

La documentation est un peu ambigu et ne mentionne pas explicitement de ReadTimeout dans l'appel à Read(), ou si ReadTimeout affecte Read() appel à tous.

Cette méthode lit les données dans le paramètre buffer et renvoie le nombre d'octets lus avec succès. Si aucune donnée n'est disponible pour la lecture, la méthode Read renvoie 0. L'opération Read lit autant de données que possible, jusqu'au nombre d'octets spécifié par le paramètre size.

Ce que je comprends est pour les 5 scénarios ci-dessus:

  1. Read() lira en octets X et revenir immédiatement. ReadTimeout n'a pas d'importance
  2. Read() lira X octets et retour
  3. Read() lira X octets et retour. Besoin d'appeler relire pour lire le reste des X octets.
  4. L'appel à Read() va attendre ReadTimeout période de temps pour les données.
  5. Read() retournera immédiatement à 0.

vous serions reconnaissants si quelqu'un peut donner des éclaircissements.

Merci.

+1

'Read()' se bloque jusqu'à ce que des données soient disponibles ou que l'autre côté ferme la connexion. Je pense que la documentation est assez trompeuse en disant "si aucune donnée n'est disponible pour la lecture, la méthode Read retourne 0". –

+2

Vous devez lire la documentation de ['ReadTimeout'] (https://msdn.microsoft.com/en-us/library/bk6w7hs8 (v = vs.110) .aspx): *" durée d'une opération de lecture blocs en attente de données "*.'Read()' bloquera l'appelant jusqu'à ce que suffisamment de données soient reçues pour être copiées dans le tampon. À moins qu'il y ait une erreur (vous obtenez '0' octets) ou le délai d'attente (vous obtenez moins que vous avez demandé). – Sinatr

+2

En fait 'Read' lancera le timeout, donc je ne sais pas quand il retournera moins. La partie bloquante est [correcte] (https://stackoverflow.com/a/6958290/1997232). – Sinatr

Répondre

1

Si vous regardez le source for NetworkStream, vous verrez que vos scénarios 1 - 4 et la compréhension est correcte (le NetworkStream appelle juste read() sur le socket). Le délai d'expiration d'une expiration est une exception IOException avec une expiration SocketException interne indiquant.

Le scénario 5 ne s'applique pas: un ReadTimeout de zéro ne peut pas exister, c'est soit moins 1 (-1, signifiant infini) ou> = 1. Donc, scen. 5 sera toujours bloqué pour toujours ou obtiendra une exception IOException avec une exception SocketException interne indiquant une erreur.

+0

Merci Gonzalez! Ça a du sens maintenant. – madu