【问题标题】:SslStream read all bytesSslStream 读取所有字节
【发布时间】:2012-01-09 16:55:17
【问题描述】:

当我尝试从 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,该值对于套接字活动没有意义(这意味着您可以下载大文件并且不用担心 SslStream 他不会关闭连接或中断接收数据)。我只是测试这个解决方案,但似乎工作正常。谢谢大家。

【问题讨论】:

    标签: c# .net network-programming


    【解决方案1】:

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

    【讨论】:

    • 我为与谷歌服务通信编写库,传输所有数据后我无法要求谷歌关闭连接。正如我所看到的,当我尝试连接到不同的站点时,一切都很好,除了“好公司”)))也许我们还有其他方法可以做到这一点?
    【解决方案2】:

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

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

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

    伪代码

    while(!Stream.end) { i = Stream.Read(缓冲区,缓冲区长度) DestStream.Write(缓冲区,我) }

    【讨论】:

    • 我不确定 Google 的协议是如何工作的,但我认为它是一个网络协议。有很多方法可以解决这个问题,但如果您使用的是其他人的协议,则需要以兼容的方式进行。
    • 很抱歉我帮不上忙,但祝你好运。希望知道更多的人说点什么。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 2021-04-03
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多