SslStream .read()以包的第一个字节返回

SEU*_*EUH 6 c# sockets websocket

我想从我的SslStream中读取数据包.

我使用websocket发送数据包.此外,此功能在我完成WS握手后启动,因此它用于读取数据帧.

这是阅读的功能:

byte[] buffer = new byte[16 * 1024];
int read;
while (true) {
    read = input.Read(buffer, 0, buffer.Length);

    Console.WriteLine("Length: " + read + " Buffer: " + GetNumberOfSlotsUsed(buffer));

    if (read <= 0) {
        ...
    } else if (read < 3) {
        ...
    } else {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我收到一个数据包,这就是打印到控制台的内容:

Length: 1 Buffer: 1
Length: 57 Buffer: 57
Run Code Online (Sandbox Code Playgroud)

问题可能在这个函数中,还是发送数据包的浏览器?

我在用Java编写的Websocket服务器中使用"socket.read()"函数并没有问题,所以它必须是C#对吗?

编辑#1:

用于发送的Javascript代码:

var socket = new WebSocket(serviceUrl, protocol);
socket.onopen = function () {
    socket.send(omeString);
}
Run Code Online (Sandbox Code Playgroud)

Tri*_*tom 6

对于未来寻找这个完全相同问题的人:

我发现一篇文章解释说这种奇怪的现象是有意设计的。

称其为“功能”似乎很奇怪。基本上(据我了解)此更改是使 SslStream 读取和写入第一个字节,然后推送其余字节。我个人认为这是一个奇怪的变化。强制传输多个数据包有点奇怪。(我完全意识到这种情况可能会发生,在数据包可能被分段的情况下强制添加一个额外的数据包是很奇怪的。)

文章链接


由Nimbus.Hex发表

When ran on machine updated with KB3147458, this output is produced:
BytesRead => 1
BytesRead => 40
BytesRead => 1
BytesRead => 40
BytesRead => 1
BytesRead => 40
BytesRead => 1
BytesRead => 40
BytesRead => 1
BytesRead => 40

When ran on a machine without KB3147458, this output is produced:
BytesRead => 41
BytesRead => 41
BytesRead => 41
BytesRead => 41
BytesRead => 41
Run Code Online (Sandbox Code Playgroud)

发布者:伊利亚·杰列布佐夫

我猜测这更具体是由 KB3142037 引起的,它是 MS16-065 的安全更新。https://support.microsoft.com/en-us/kb/3155464详细介绍了此处的问题和一些解决方法 。有一些注册表项可用于禁用此“功能”。


微软发布:

嗨 Nimbus.Hex,是的,伊利亚是正确的。这是针对 MS16-065 安全更新所做的行为更改。有关此更改的更多详细信息,请访问https://support.microsoft.com/en-us/kb/3155464。我将此解决为“按设计”问候,Himadri