SslStream读取所有字节

时间:2012-01-09 16:55:17

标签: c# .net network-programming

当我尝试从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上设置读取超时等于1,这个值对socket alive没有意义(它的意思是你可以下载大文件而不用担心SslStream他不会关闭连接或中断接收数据)。我只是测试这个解决方案,但似乎工作正常。大家好。

4 个答案:

答案 0 :(得分:2)

您正在从网络流中读取,这意味着您将不会遇到流的结束,直到另一方关闭其连接的一半。仅停止发送数据是不够的。因此,让其他程序在发送了它想要的所有数据后关闭连接。

答案 1 :(得分:2)

在连接关闭之前,流不会结束。这是所有未知长度的流的本质。

您需要提前知道长度,或者在连接关闭之前需要继续阅读。一种常见的方法是将流的字节长度作为64位int传输。所以你的流的前8个字节被读入int64,其余的是数据。

通常一次在流中读取一个“缓冲区”。

伪代码

而(!Stream.end) {  i = Stream.Read(buffer,buffer.length)  DestStream.Write(buffer,i) }

答案 2 :(得分:0)

有点晚了,但我正在使用带有以下修改的msdn代码

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

答案 3 :(得分:0)

如果适合您,请使用此工作补丁:

greater than 50