【问题标题】:.Net SslStream Write/Read issue.Net SslStream 写入/读取问题
【发布时间】:2016-05-05 14:30:43
【问题描述】:

当我阅读 .Net SSLStream 时,我似乎无法一口气读完所有内容。 read 方法总是只获取第一个字节。无论数据或缓冲区大小如何,我都需要循环获取剩余数据。

例子:

客户

var message = new byte[]{1,2,3,4,5};
   sslStream.Write(messsage);
   sslStream.Flush();

服务器

byte[] buffer = new byte[4000];
bytes = sslStream.Read(buffer, 0, buffer.Length);

我做错了吗?为什么第一次读取时只读取一个字节?

【问题讨论】:

    标签: c# .net ssl stream sslstream


    【解决方案1】:

    流式 API 不承诺您每次读取返回特定数量的字节。您可以从 1 开始读取任意数量的字节。您的代码必须能够处理按字节接收数据,即使您要求更大的块并且即使您发送了更大的块。

    最好的解决办法是不使用套接字。使用更高级别的 API,例如 WCF、SignalR、HTTP、...

    如果您坚持,您可能应该使用BinaryReader/Writer 发送您的数据。这很容易。

    如果您不想要任何内容​​,则需要循环读取,直到收到所需的字节数

    【讨论】:

    • 不清楚反对票的来源。这个答案是正确的。也许路人不理解技术问题?!
    【解决方案2】:

    @usr 关于应该实现流读取的方式是完全正确的,并且您不会期望任何东西。 另一方面,发生在我身上的事情也发生在@Bubba 身上。代码可以正常工作,但现在不行。原因? .net 框架的 Microsoft 更新。 更多细节在这里: https://connect.microsoft.com/VisualStudio/feedback/details/2590316/windows-10-update-kb3147458-changes-behavior-of-sslstream-read-beginread-endread

    【讨论】:

    • Code was, working and now it's not 巧合地工作,但一开始就坏了。该更新使您的错误暴露无遗。不过,了解它现在为何会崩溃是很有价值的。
    • 没错。但是,当更新让你如此崩溃时,这可能会非常令人震惊。
    【解决方案3】:

    我遇到了同样的问题。代码在几周前就可以工作了——现在它不工作了。我想知道微软的更新之一是否破坏了它?

    我创建了一个解决方法(hack) - 直到我弄清楚问题所在: (在班级层面)

    string previousChar = null;
    

    (在 TcpClient.GetStream.Begin 的回调函数中)

            if ((previousChar == null) && (bytesRead == 1))
            {
                previousChar = Encoding.ASCII.GetString(readBuffer, 0, bytesRead);
            }
            // Convert the byte array the message was saved into
            if (bytesRead > 6)
            {
                message = Encoding.ASCII.GetString(readBuffer, 0, bytesRead);
                if (previousChar != null)
                {
                    message = previousChar + message;
                    previousChar = null;
                }
    

    【讨论】:

    • 我的回答应该涵盖你的问题。
    • 此更新日期与您的问题日期非常相似 :) support.microsoft.com/en-us/kb/3142037
    • 这个答案不正确。它可能会掩盖问题,但不能正确修复它。 SslStream 不承诺读取请求的字节数。它从来没有承诺过。调用代码必须处理这个问题。此 Windows 更新只是暴露了导致我的客户抱怨的错误。
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多