QTcpSocket (nntp は QTcpSocket へのポインター) からデータを読み取るループの本体に、次のコード スニペットがあります。
std::vector<char> buffer;
int bytesAvailable = nntp->bytesAvailable();
qDebug() << "bytesAvailable: "<<bytesAvailable;
if(bytesAvailable <= 0) break;
buffer.resize(bytesAvailable);
bytesRead = nntp->read(&buffer[0], bytesAvailable);
qDebug() << (nntp->state() == QAbstractSocket::ConnectedState);
qDebug() << "bytesRead: "<<bytesRead;
断続的に、これは次のようなものを出力します。
bytesAvailable: 24
true
bytesRead: 0
そして、そこからの私のコードは誤動作します。これは私には非常に奇妙に思え、QTcpSockets の仕組みを完全に誤解していることを示唆しています。確かに、bytesAvailable > 0 の場合、後続の読み取りは、bytesAvailable バイトをバッファに読み込むことができることを意味します。この場合、bytesRead は == bytesAvailable である必要があります。または、何か不足していますか?私の現在の疑いは、それがある種のメモリ破損である可能性があるということです..
編集:いくつかの nntp.errorString() メッセージをスローすると、この失敗中に「ネットワーク操作がタイムアウトしました」と報告されます。これが何を意味するのか調査する必要があります...(アイデア?)
EDIT 2:「ネットワーク操作がタイムアウトしました」は、読み取りがタイムアウトしたことを意味しているようです。コードが正常に (断続的に) 動作する場合でも、この「エラー」が発生します。
編集 3: 上記のコード スニペットの完全なアルゴリズム コンテキストは、このペーストビンのリンクにあります。
EDIT 4: EDIT 3 の関数のわずかに異なるバージョンですが、それでも同じ問題がありますが、この新しいペーストビン リンクにあります。