.Net SslStream写/读问题

时间:2016-05-05 14:30:43

标签: c# .net ssl stream sslstream

当我阅读.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);

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

3 个答案:

答案 0 :(得分:3)

Streaming API不保证每次读取返回特定数量的字节。你可以从1开始读取任意数量的字节。即使你要求更大的块,即使你发送了更大的块,你的代码必须能够按字节顺序处理数据。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

我遇到了同样的问题。该代码几周前正在运行 - 现在它无法运行。我想知道微软的一个更新是否打破了它?

我创造了一个工作(黑客) - 直到我能弄清楚问题是什么: (在班级)

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