.NET SslStream 写入/读取问题

4
当我读取一个 .Net SSLStream 时,似乎无法一次性读取所有内容。读取方法总是只获取第一个字节。我需要循环读取剩余的数据,无论数据或缓冲区大小。
示例:
客户端
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);

我有什么做错了吗?为什么它只在第一次读取时读取一个字节?
3个回答

3

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

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

如果您坚持要使用,可能应该使用BinaryReader/Writer来发送数据。这样做非常容易。

如果您不想使用上述内容,则需要循环读取,直到已接收到所需的字节数


不清楚这个踩票来自哪里。这个答案是正确的。也许一个路人没有理解技术问题?! - usr

2

代码之前能够工作,但现在不能了。它之前只是偶然能够工作,实际上一开始就有问题。更新揭示了你的错误。然而,理解为什么它现在出现问题是很有价值的。 - usr
没错。但是,当更新突然袭来时,这可能会让人感到震惊。 - 100r

-1

我遇到了同样的问题。几周前代码还能正常运行,现在却不能了。我想知道是不是其中一个微软更新导致了这个问题?

我创建了一个临时解决方案(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;
            }

我的回答应该能够解决您的问题。 - usr
此更新日期与您的问题日期非常相似 :) https://support.microsoft.com/zh-cn/kb/3142037 - 100r
这个答案是不正确的。它可能会掩盖问题,但它并没有正确地解决它。SslStream不能保证读取请求的字节数。它从来没有承诺过。调用代码必须处理这个问题。这个Windows更新只是让这个bug暴露出来,导致我的客户抱怨。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接