我正在使用Qt開發NMDC客戶端(p2p,DC++和朋友)。該協議本身是非常簡單的:查找zlib壓縮流的結尾
$command parameters|
除了compression:
「ZPipe通過發送一個命令$ ZON |給客戶端$ ZON經過了ZLib壓縮的含流命令將隨之而來。此流將與zlib的定義EOF結束(沒有$佐夫的壓縮數據流中!)」
下面是相關代碼:
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(),但是想要一個完整的流,沒有什麼比這更簡單了。
嗯,一個明顯的改進就是不斷地將'zout'漸進地刷入'buffer' - 這樣你甚至可以在壓縮流全部到達之前開始分析。另一方面,在'$ ZOn |'內看到一個'$ ZOn |'將會是非常可怕的...... – ephemient 2009-10-28 16:59:33