繁体   English   中英

SslStream 读取所有字节

[英]SslStream read all bytes

当我尝试从 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));
    }

提前谢谢。

更新:

我想我找到了答案。 我可以将 SslStream 上的读取超时设置为等于 1,该值对于套接字活动没有意义(这意味着您可以下载大文件并且不用担心 SslStream 他不会关闭连接或中断接收数据)。 我只是测试这个解决方案,但似乎工作正常。 谢谢大家。

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

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

您要么需要提前知道长度,要么需要继续阅读直到连接关闭。 一种常见的方法是将流的字节长度作为 64 位 int 传输。 所以你的流的前 8 个字节被读入一个 int64,然后剩下的就是数据。

通常,人们一次读取一个“缓冲区”。

伪代码

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

有点晚了,但我正在使用 msdn 代码并进行以下修改

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

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

                int bytesRead = 0;
                string chunkString = "";
                do
                {
                    byte[] responseBuffer = new byte[CHUNKSIZE];
                    bytesRead = sslStream.Read(responseBuffer, 0, responseBuffer.Length);
                    ApplicationHelper.ApplicationLogger.WriteInfoLog("Bytes Received " + bytesRead);
                    if (bytesRead > 0)
                    {
                        chunkString = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead);
                        responseXML += chunkString;
                    }

                }
                while (!chunkString.EndsWith(EOF));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM