【发布时间】:2009-10-28 15:17:45
【问题描述】:
我正在使用 Qt 开发 NMDC 客户端(p2p、DC++ 和朋友)。协议本身非常简单:
$command parameters|
compression除外:
"ZPipe 通过向客户端发送命令 $ZOn| 来工作。在 $ZOn 之后,将跟随一个包含命令的 ZLib 压缩流。该流将以 ZLib 定义的 EOF 结束。(压缩流中没有 $ZOff !)”
以下是相关代码:
QTcpSocket *conn;
bool compressed;
QByteArray zbuffer;
QByteArray buffer;
// ...
void NMDCConnection::on_conn_readyRead() {
// this gets called whenever we get new data from the hub
if(compressed) { // gets set when we receive $ZOn
zbuffer.append(conn->readAll());
// Magic happens here
if( stream_is_complete ) {
buffer.append(uncompressed_stream);
buffer.append(remainder_of_data);
compressed = false;
}
} else {
buffer.append(conn->readAll());
};
parse(buffer);
}
那么,如何获取 stream_is_complete、uncompressed_stream 和 remainder_of_data 的值?我无法寻找下一个'$',因为流可以包含它。我尝试在 zlib 文档中寻找类似 EOF 的东西,但没有这样的东西,事实上,每个流都以看似随机的字符结尾。
我也玩过 qUncompress(),但它需要一个完整的流,仅此而已。
【问题讨论】:
标签: c++ c qt networking zlib