2010-06-18 3 views
1

J'ai une connexion TCP ouverte, et la lecture en utilisant NetworkStream.BeginRead(). Une fois que la connexion est fermée à chaque extrémité, le callback est appelé et l'objet stream est inutile - comme la documentation dit, EndRead() lance IOException ou ObjectDisposedException en fonction de la fin de la connexion..NET NetworkStream fermé, comment être sûr que toutes les données sont lues?

Est-il garanti qu'il n'y a pas de données qui me manquent juste entre la dernière EndRead réussie (et la re-BegingRead) et la déconnexion, en particulier si je le fais à mon extrémité? Si ce n'est pas le cas, au cas où je ferais la fermeture de la connexion, dois-je manuellement NetworkStream.Read() lors de la déconnexion pour m'assurer que rien n'est laissé non lu?

Répondre

2

Le modèle à utiliser dans ce cas est d'utiliser BeginRead pour lire le flux (exactement comme vous le faites) et pour gérer le cas 'plus de données dans le flux' dans la méthode de rappel.
La méthode de rappel appelle EndRead et collecte les données lues dans le flux (généralement en les ajoutant à une instance de StringBuilder) , puis appelle à nouveau BeginRead. Dès que EndRead renvoie 0 octet, c'est votre garantie qu'il n'y a plus de données à lire dans le flux.

est ici la documentation peut vous être utile: Using async client sockets

Je remarqué que nulle part là-dedans at-il expressément que le retour de 0 octet est la garantie, donc je comprends votre confusion, mais l'exemple est très clair que c'est ton signal pour arrêter de lire.

+0

Woo-hoo! Je connais des choses qui sont correctes mais que personne d'autre ne connaît assez pour confirmer ou infirmer! Euh, attendez une minute, pourquoi suis-je heureux à ce sujet? – Task

+0

Je vais ressusciter ceci dans l'espoir que l'on répondra à cette question (très proche): Comment 'EndRead' peut-il produire 0 octets lus, si le seul moyen' EndRead' est appelé est dans le rappel de 'BeginRead', les données doivent être transmises pour être exécutées? Devrais-je simplement envoyer une réponse zéro octet? – Brandon

+0

Eh bien, maintenant vous parlez de * écrire * dans le flux au lieu d'en lire. C'est un peu différent. Avez-vous une question ouverte à lier? En substance, vous n'avez pas à écrire spécifiquement zéro octet, il vous suffit d'en finir avec votre réponse. – Task

Questions connexes