我在循环体中有以下代码片段,负责从 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() 消息报告在此失败期间,“网络操作超时”。我需要调查这意味着什么......(想法?)
编辑2:似乎“网络操作超时”只是意味着读取超时。当代码正常工作时(即间歇性地),我仍然会收到这个“错误”。
编辑 3:上述代码片段的完整算法上下文可以在这个 pastebin 链接中找到。
编辑 4:编辑 3 中的函数版本略有不同,但仍然存在相同的问题,在这个较新的 pastebin 链接上