SslStream читать все байты - PullRequest
       15

SslStream читать все байты

2 голосов
/ 09 января 2012

Когда я пытаюсь прочитать из SslStream, функция Read () никогда не заканчивается, если мне не задано время ожидания соединения, но если я это сделаю, у меня есть исключение времени ожидания.У этого парня такая же проблема http://msdn.microsoft.com/en-us/library/system.net.security.sslstream.read.aspx. Не знаю, что здесь делать, код

    public byte[] ReadBytes()
    {
        this.bufferGlobal.Clear();
        byte[] buffer = new byte[this.bufferSize];
        int recv = this.stream.Read(buffer, 0, buffer.Length);
        while (recv != 0)
        {
            addBytes(buffer, ref bufferGlobal, recv);
            recv = this.stream.Read(buffer, 0, buffer.Length);                
        }
        return (byte[])this.bufferGlobal.ToArray(typeof(byte));
    }

Спасибо заранее.

UPD:

я думаю, что найду ответ.Я могу установить тайм-аут чтения на SslStream равным единице, это значение не имеет смысла для живого сокета (это означает, что вы можете загружать огромные файлы и не беспокоиться о SslStream, он не закроет соединение или не прекратит получение данных).Я только тестирую это решение, но, кажется, работает нормально.Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Поток не закончится, пока соединение не будет закрыто. Такова природа всех потоков неизвестной длины.

Вам либо нужно знать длину заранее, либо вам нужно продолжать чтение, пока соединение не будет закрыто. Распространенным способом является передача байтовой длины потока в виде 64-битного целого. Таким образом, первые 8 байтов вашего потока считываются в int64, а остальные - данные.

Обычно каждый читает в потоке один «буфер» за раз.

псевдокод

в то время как (! Stream.end) { i = Stream.Read (buffer, buffer.length) DestStream.Write (буфер, я) }

2 голосов
/ 09 января 2012

Вы читаете из сетевого потока, что означает , вы не встретите конец потока, пока другая сторона не закроет свою половину соединения . Для этого недостаточно прекратить отправку данных. Поэтому заставьте другую программу закрыть соединение после того, как она отправит все данные, которые она намеревается.

0 голосов
/ 18 мая 2018

бит поздно, но я использую код MSDN со следующей модификацией

if (sb.ToString().IndexOf("a OK") != -1 || sb.ToString().IndexOf("a BAD") != -1 || sb.ToString().IndexOf("a NO") != -1)
            {
                break;
            }
...