Я работаю на клиенте NMDC (p2p, DC ++ и друзья) с Qt. Сам протокол довольно прост:
$command parameters|
За исключением сжатия :
"ZPipe работает, посылая команду $ ZOn | клиенту. После $ ZOn последует сжатый поток ZLib, содержащий команды. Этот поток завершится EOF, который определяет ZLib. (В сжатом потоке нет $ 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
? Я не могу найти следующий «$», потому что поток может содержать его. Я попытался найти что-то похожее на EOF в документации zlib, но на самом деле такого не бывает, каждый поток заканчивается на первый взгляд случайным символом.
Я также играл с qUncompress (), но для этого нужен полный поток, ни меньше, ни больше.