2012-08-01 3 views
1

Je travaille avec StreamSockets dans une application Windows 8 Metro et je souhaite utiliser un DataReader pour lire les données entrantes. Existe-t-il un modèle ou un modèle spécifique que je devrais utiliser pour lire à partir du socket, ce qui me permettra de lire toutes les données disponibles dans le buffer réseau à tout moment?Lecture StreamSocket dans Metro

Actuellement, je comprends que j'ai besoin de faire des appels à DataReader.LoadAsync(), puis DataReader.Read ...(). Je veux être capable de lire tout ce qui est présent tampon réseau à tout moment. Mon problème se pose lorsque je veux détecter la fin du message entrant. Si j'essaie d'utiliser une boucle pour appeler continuellement LoadAsync, il bloquera quand il atteindra la fin du tampon réseau. Je sais dans .NET 4.0, il y a une classe NetworkStream qui fournit un champ DataAvailable qui me dit s'il y a des données présentes dans le tampon réseau, donc je peux continuer à boucler jusqu'à ce que cet indicateur soit faux. Est-il possible de faire quelque chose de similaire qui me permettra de consommer toutes les données disponibles dans le buffer réseau sans avoir à bloquer pendant longtemps?

Répondre

0

Définissez DataReader.InputStreamOptions = InputStreamOptions.Partial. Ce sera votre attendre (votre tâche) pour retourner avant que le tampon que vous avez fourni est entièrement rempli.

using(DataReader inputStream = new DataReader(this.connection.InputStream)) 
{ 
    inputStream.InputStreamOptions = InputStreamOptions.Partial; 
    DataReaderLoadOperation loadOperation = inputStream.LoadAsync(2500); 
    await loadOperation; 
    if(loadOperation.Status != AsyncStatus.Completed) 
    { 
     this.Disconnect(); //insert your handler here 
     return; 
    } 

    //read complete message 
    uint byteCount = inputStream.UnconsumedBufferLength; 

    byte [] bytes = new byte[byteCount]; 
    inputStream.ReadBytes(bytes); 

    this.handleServerMessage(bytes); //insert your handler here 

    //detach stream so that it won't be closed when the datareader is disposed later 
    inputStream.DetachStream();     
} 
Questions connexes