Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Thrift如何处理在多条消息上拆分的Zlib刷新标记? 我有一个应用程序,它使用Apache节约,有C++服务器和C客户端。我在服务器上使用zlib压缩,在客户端使用Ionic.zlib解压数据的包装器,这在大多数情况下都有效_C#_C++_Thrift_Zlib - Fatal编程技术网

C# Thrift如何处理在多条消息上拆分的Zlib刷新标记? 我有一个应用程序,它使用Apache节约,有C++服务器和C客户端。我在服务器上使用zlib压缩,在客户端使用Ionic.zlib解压数据的包装器,这在大多数情况下都有效

C# Thrift如何处理在多条消息上拆分的Zlib刷新标记? 我有一个应用程序,它使用Apache节约,有C++服务器和C客户端。我在服务器上使用zlib压缩,在客户端使用Ionic.zlib解压数据的包装器,这在大多数情况下都有效,c#,c++,thrift,zlib,C#,C++,Thrift,Zlib,我注意到,在非常特定的情况下,客户机会因以下错误之一而崩溃: Thrift.Protocol.TProtocolException: Missing version in readMessageBegin, old client? at Thrift.Protocol.TBinaryProtocol.ReadMessageBegin() Ionic.Zlib.ZlibException: Bad state (invalid block type) at Ionic.Zlib.In

我注意到,在非常特定的情况下,客户机会因以下错误之一而崩溃:

Thrift.Protocol.TProtocolException: Missing version in readMessageBegin, old client?
   at Thrift.Protocol.TBinaryProtocol.ReadMessageBegin()

Ionic.Zlib.ZlibException: Bad state (invalid block type)
   at Ionic.Zlib.InflateManager.Inflate(FlushType flush)
我发现,在发生这些错误的所有情况下,服务器都会发送两个包,一个刚刚超过1024字节(这是TZlibTransport.cpp使用的大小),另一个是5-8字节。查看第二个包上的数据,我注意到zlib使用的是刷新标记,添加了两次

ff ff 00 00 00 ff ff
第一个标记的第一部分位于上一个包的末尾。如果我稍微增加缓冲区的大小,使其有足够的空间在一个包中写入标记,则不会发生崩溃,因此我认为是该标记添加了两次才导致了问题。然而,仅仅改变这个缓冲区大小并不是一个解决方案,因为这意味着错误发生在应用程序的其他地方

我研究了zlib,发现如果在缓冲区()中没有给它足够的空间,这是预期的行为。然而,我还没有找到任何人遇到这一点,导致节俭问题


因此,我的问题是,对于特定的数据长度,thrift是否会将标记拆分为多个包,以及客户机应该如何处理此问题。

问题似乎不是标记发出了两次,而是第一个标记没有完全放入缓冲区。如果输出仅为
ff ff
,则会出现完全相同的问题和相同的错误消息<代码>ff无法启动放气流,因为它提供了无效的块类型(3)


从您的描述来看,Thrift中似乎存在一个缺陷,因为它无法确保和/或检查所有压缩数据是否确实适合缓冲区。

感谢您的回复,帮助我了解了哪里出了问题。在这种情况下,是否应该用零填充第一个包,以便所有标记都在第二个包中?这会导致zlib出现任何问题吗?@ldsrc:您能提交一个请求并(如果可能)添加一个请求吗?那真是太棒了@JensG我已经为它提交了JIRA票证,@ldsrc以确保当前的deflate块在字节边界上结束,会发出一个空的存储块,它是三个零位,最后一个字节根据需要填充零以到达字节边界,然后是字节00 ff ff。要使单个数据包上的充气操作正确完成并处于下一个数据块中字节的状态,所有这些都应适合上一个数据包。用零填充不是充气所期望或将要处理的事情。一句话:数据包需要更大,或者压缩的数据量需要更少,这样才能适合。