WebSocket permessage-deflate C#



我用C#编写了一个WebSocket,并试图实现permesage deflate扩展。C#DeflateStream似乎无法解压缩从Chrome(36.0.1985.143m版本)发送的消息有效载荷,这是我迄今为止唯一尝试过的一个。我得到了";块长度与其补码"不匹配";尝试解压缩时的消息。这不是RFC 1950,RFC 1951的2字节头问题。

我在C#中使用了DeflateStream来压缩相同的数据(字符串"Hello"),试图查看压缩数据中的差异。奇怪的是,压缩的Chrome负载和C#压缩的数据除了第一个字节外完全相同!Chrome负载的第一个字节总是比第一个字节少1,即使在将示例压缩字符串从"hello"更改为其他任何字符串时也是如此。我可以简单地在第一个字节上加1,有效负载就会解压缩。

我发现了一个针对WebSocket的压缩扩展草案,它讨论了这个问题,但并没有解决C#的问题。

第8.2.3.1节使用"Hello"示例字符串,并显示正确的压缩有效载荷:0xf2 0x48 0xcd 0xc9 0xc9 0x07 0x00

然后,第8.2.3.4节继续讨论使用BFINAL设置为1的放气块,从而产生:0xf3 0x48 0xcd 0xc9 0xc9 0x07 0x00 0x00

0xf3数据是C#DeflateStream压缩和解压缩的数据,没有任何问题。似乎在涉及BFINAL的算法中有一个通货紧缩选项,而C#不提供此设置?

我希望有人可能熟悉这个问题,或者知道如何解决这个问题。如果可能的话,我宁愿不在第三方库中链接。

谢谢。

它使用PPP协议,该协议在传输之前将0x00 0x00 0xff 0xff从deflate流的末尾丢弃。只需在将这四个字节馈送到解压缩器之前将其附加即可。

我在C#中开发了一个支持deflate压缩的Websocket组件。

首先,不能压缩完整的连接,因为DeflateStream是如何缓冲数据的。您可以压缩邮件。换句话说,它不支持上下文接管,您必须在HTTP协商中指出这一点。

此外,当刷新完DeflateStream后,必须向流中写入一个字节0。请检查我编写压缩消息的源代码。

在Deflate WebSocketListener扩展中,您可以找到以下示例:

  • 谈判
  • 必须在消息中启用的标志
  • 写作
  • 阅读

相关内容

  • 没有找到相关文章

最新更新