C# - TcpClient de Détection de fin de stream?

Je suis en train d'interface d'un ancien réseau de la caméra de mon ordinateur et je suis bloqué sur un point fondamental de problème -- la détection de la fin du flux.

Je suis en utilisant TcpClient pour communiquer avec l'appareil photo et je peux le voir à la transmission de la commande de données, pas de problèmes ici.

        List<int> incoming = new List<int>();            
        TcpClient clientSocket = new TcpClient();
        clientSocket.Connect(txtHost.Text, Int32.Parse(txtPort.Text));
        NetworkStream serverStream = clientSocket.GetStream();
        serverStream.Flush();

        byte[] command = System.Text.Encoding.ASCII.GetBytes("i640*480M");
        serverStream.Write(command, 0, command.Length);

La lecture de la réponse est là que le problème commence. J'ai d'abord pensé à quelque chose de simple comme le bit suivant de code aurait travaillé:

        while (serverStream.DataAvailable)
        {
            incoming.Add(serverStream.ReadByte());
        }

Mais il n'a pas, donc j'ai eu un aller à une autre version, cette fois en utilisant ReadByte(). La description dit:

Lit un octet à partir du flux et
les progrès de la position dans le
flux de par un octet, ou retourne -1 si
à la fin du flux.

j'ai donc pensé que je pourrais mettre en place quelque chose le long des lignes de:

        Boolean run = true;
        int rec;
        while (run)
        {
            rec = serverStream.ReadByte();

            if (rec == -1)
            {
                run = false;
                //b = (byte)'X';
            }
            else
            {
                incoming.Add(rec);
            }

        }

Non, ne fonctionne toujours pas. Je peux effectivement voir les données et après un certain point (qui n'est pas toujours le même, sinon je pourrais avoir simplement lu que le nombre d'octets à chaque fois) je commence à être 0 comme valeur pour le reste des éléments et il n'a pas arrêter jusqu'à ce que j'ai arrêter manuellement l'exécution. Voici à quoi il ressemble:
C# - TcpClient de Détection de fin de stream?

Donc ma question est, suis-je raté quelque chose de fondamental ici? Comment puis-je détecter la fin du stream?

Merci beaucoup,

H.

Vous êtes en train de lire un octet stream, un octet peut pas être -1.
Juste brainfarting ici, mais peut-être qu'il n'est pas la fin du flux, qu'il ne cesse de transmettre des données, et les 0 sont une sorte de signal KeepAlive ou quelque chose. Une autre idée pourrait être, que le 0 est la fin du cours d'eau. Comparer au reste des données que vous obtenez, si vous ne voyez que les valeurs non nulles, alors vous pouvez supposer que 0 est l'EOS signal de la caméra. Si tu vois un peu à zéro des valeurs, de détecter à chaque fois que vous obtenez 4 ou 8 zéros dans une rangée. Je ne sais pas si tout cela est utile, c'est pourquoi je suis juste de faire un commentaire.
Selon la documentation de ReadByte() retourne en fait un int.
Je n'ai pas pensé à KeepAlive TBH, merci. Malheureusement je n'ai avoir des occasions où je reçois un tas de zéros dans les données de sorte que vous ne savez pas si je peux utiliser cette méthode pour détecter la fin de la trame.
Eh bien, comme @Le Mal Greebo suggère ci-dessous, vous avez besoin de trouver quelques modèles dans le flux. Je vous suggère de lire un morceau. Peut-être 1 ko de données ou que ce soit adapté à la plupart des paquets, puis effectuez l'une à côté d'hex de comparer, pour voir ce qui est commun, surtout à la fin, avant que tous les zéros de début.

OriginalL'auteur Hamza | 2011-06-29