У меня есть следующий фрагмент кода в теле цикла, отвечающего за чтение данных из 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
&buffer[0]
. Вместо этого попробуйтеbuffer = nntp->readAll();
. - person Amartel   schedule 20.05.2013