C# - TcpClient-обнаружение конца потока?

Я пытаюсь подключить древнюю сетевую камеру к своему компьютеру, и я застрял в очень фундаментальной проблеме-обнаружении конца потока.

я использую TcpClient для связи с камерой, и я действительно вижу, что он передает данные команды, здесь нет проблем.

        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);

чтение ответа-это то,где начинается проблема. Сначала я думал, что что-то простое, как следующий бит кода, будет иметь работал:

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

но это не так, поэтому на этот раз у меня была другая версия, использующая ReadByte(). Описание гласит:

считывает байт из потока и продвигает позицию в рамках потоке на один байт, или возвращает -1, если в конце ручья.

поэтому я подумал, что могу реализовать что-то вроде:

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

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

        }

нет, все еще не работает. Я могу видеть данные В и после определенного точка (которая не всегда одинакова, иначе я мог бы просто читать столько байтов каждый раз) я начинаю получать 0 как значение для остальных элементов, и он не останавливается, пока я вручную не остановлю выполнение. Вот как это выглядит: data

Итак, мой вопрос в том, не упускаю ли я здесь чего-то фундаментального? Как я могу определить конец потока?

большое спасибо,

Х.

2 ответов


что вам не хватает, так это то, как вы думаете о потоке данных TCP. Это открытое соединение, как открытая телефонная линия - кто-то на другом конце может или не может говорить (DataAvailable), и только потому, что они остановились, чтобы перевести дух (DataAvailable==false) это не означает, что они действительно закончили с их текущим утверждением. Через мгновение они снова могли говорить (DataAvailable==true)

вам нужно иметь какие-то определенные правила для протокола связи выше TCP, что на самом деле просто транспортный уровень. Так, например, возможно, камера отправит вам специальную последовательность символов, когда будет завершена передача текущего изображения, и поэтому вам нужно изучить каждый отправленный символ и определить, была ли эта последовательность отправлена вам, а затем действовать соответствующим образом.


Ну, вы не можете точно сказать, что EOS на сетевом сообщении ( если другая сторона не отключит соединение), обычно сам протокол содержит что-то, чтобы сигнализировать, что сообщение завершено (иногда новая строка, например ). Таким образом, Вы читаете поток и передаете буфер, и извлекаете полное сообщение, применяя эти стратегии.