【发布时间】:2013-05-15 05:21:45
【问题描述】:
我在循环体中有以下 sn-p 代码,负责从 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:上述 sn-p 代码的完整算法上下文可以在 at this pastebin link 找到。
编辑 4:编辑 3 中的函数版本略有不同,但仍然存在相同的问题,位于 this newer pastebin link
【问题讨论】:
-
我真的不喜欢这种结构:
&buffer[0]。相反,请尝试buffer = nntp->readAll();。 -
感谢您的建议 Amartel 但切换到 QByteArray 然后执行 readAll 然后使用 QByteArray 的大小来确定读取的字节数仍然会导致相同的问题
标签: c++ qt sockets qtcpsocket