2014-09-26 78 views
4

我在C#中編寫了一個WebSocket,並試圖實現permessage-deflate擴展。看來C#DeflateStream無法解壓從Chrome發送的消息有效載荷(版本36.0.1985.143米) - 我迄今爲止嘗試的唯一一個。嘗試解壓縮時,出現「塊長度與其補碼不匹配」消息。這不是RFC 1950,RFC 1951 2字節標題問題。WebSocket permessage-deflate C#

我已經使用C#中的DeflateStream壓縮相同的數據(字符串'Hello'),試圖查看壓縮數據的差異。奇怪的是,壓縮的Chrome有效載荷和C#壓縮數據完全相同,除了第一個字節!即使將示例壓縮字符串從'hello'更改爲其他任何內容,Chrome有效內容的第一個字節也始終比第一個字節小1。我可以簡單地在第一個字節中加1,並且解壓縮負載。

我發現了一個Compression Extensions for WebSocket草案,討論了這個問題,但並未解決C#的問題。

第8.2.3.1使用「你好」後的樣本串並顯示正確的壓縮的有效載荷: 0xf2 0x48 0XCD 0xc9 0xc9 0x07的0×00

第8.2.3.4然後繼續使用帶有放氣塊討論BFINAL設置爲1,其產生: 0xf3 0x48 0XCD 0xc9 0xc9 0x07的0×00 0×00

0xf3數據是什麼的C#DeflateStream壓縮並沒有問題解壓縮。似乎在涉及BFINAL的算法中存在通縮選項,並且C#不提供此設置?

我希望有人可能會熟悉這個問題或知道如何解決這個問題。如果可能的話,我不想鏈接到第三方庫。

謝謝。

回答

1

它使用的是PPP協議,它在發送之前從deflate流的末尾丟棄0x00 0x00 0xff 0xff。在將它們提供給解壓縮器之前,只需附加這四個字節即可。

1

我開發了Websocket component in C# that supports deflate compression

首先,無法壓縮完整連接,因爲DeflateStream如何緩衝數據。您可以壓縮消息。換句話說,它不會支持上下文接管,並且您必須在HTTP協商中指明。

而且,當您完成對DeflateStream的流水清理時,您必須將一個字節0寫入流中。請檢查我的source code involved in writting compressed messages

Deflate WebSocketListener extension你可以找到如何例子: