Qt を使用して NMDC クライアント (p2p、DC++ など) に取り組んでいます。プロトコル自体は非常に簡単です。
$command parameters|
圧縮を除く:
「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() をいじりましたが、それは完全なストリームを必要とします。