2009-06-17 8 views
3

Je voudrais vider tampon de lecture de la prise donc j'écrit le code de suivi ...Comment appeler NetworkStream.Read() sans blocage?

byte[] tempBuffer = new byte[1024]; 
int readCount = 0; 
while ((readCount = tcpSocket.GetStream().Read(tempBuffer, 0, tempBuffer.Length)) != 0) 
{ 
    // do with tempBuffer 
} 

Mais méthode Read() est bloquée alors j'ai ajouté tcpSocket.ReceiveTimeout = 1;. Et cela fonctionne comme avant.

Comme je sais, cela est généralement utilisé en C++. Comment puis-je résoudre ce problème?

Répondre

4

Vous pouvez utiliser la propriété DataAvailable pour voir s'il y a quelque chose à lire avant de faire un appel à la méthode de lecture.

+0

J'ai enveloppé mon code avec un bloc try-catch afin de détecter la déconnexion. Si j'utilise la propriété DataAvailable, comment puis-je le faire? –

+0

Si vous suivez le lien vers la méthode DataAvailable dans ma réponse, vous verrez qu'il y a un exemple de code qui fait ce que vous voulez. Vous êtes bien sûr libre d'emballer le tout dans un essay-catch pour gérer la déconnexion. –

2

Utilisez la fonction directement NetworkStream.Read(), au lieu d'utiliser GetStream():

Si aucune donnée est disponible pour la lecture, la méthode Read retourne 0. La lit opération de lecture autant de données que sont disponibles, jusqu'au nombre d'octets spécifié par le paramètre size. Si l'hôte distant arrête la connexion et que toutes les données disponibles ont été reçues , la méthode Read se termine immédiatement et renvoie zéro octets. NoteNote:

+0

Il n'y a pas cette fonction de membre statique. Laissez-moi voir du code s'il vous plaît. –

+0

qui n'est pas une fonction statique. Si vous avez lu le lien MSDN que j'ai fourni, vous avez vu qu'il s'agit d'une méthode sur l'objet NetworkStream. Puisque vous avez omis de fournir le type réel de votre variable 'tcpSocket', je devais deviner le reste de votre texte. –

+4

Je ne suis pas sûr de ce dont vous parlez ici. L'OP utilise en fait un objet NetworkStream via 'tcpSocket.GetStream()'. – danyim

1

Pourquoi voulez-vous vider le tampon de lecture? Si vous ne voulez pas que le contenu de la prise le ferme. Si vous ne voulez pas le contenu actuel, mais que vous voulez des données plus tard, comment savez-vous quand plus tard commence. Si les données sont un flux non encapsulé ...

Vous semblez avoir résolu le problème de la mauvaise façon. Que voulez-vous dire par l'utilisation de la fonction ** directement **

+0

Ce que je voulais dire par vider le tampon, c'est que je voulais lire toutes les données du tampon et les envoyer, pas les ignorer. Habituellement je fais comme ça quand je fais le serveur. –

Questions connexes