我在负责从QTcpSocket读取数据的循环体中有以下代码片段(nntp是指向QTcpSocket的指针)。为什么我的代码不能读取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:上面的代码片段的完整算法上下文可以找到at this pastebin link。
编辑4:编辑3,但仍与仍然同样的问题略有不同版本的功能是在this newer pastebin link
我真的不喜欢这种结构:'&buffer [0]'。相反,请尝试'buffer = nntp-> readAll();'。 – Amartel
感谢您的建议Amartel,但切换到QByteArray,然后做一个readAll,然后使用QByteArray的大小来确定读取的字节数仍然会导致相同的问题 –