QTcpSocket (nntp는 QTcpSocket에 대한 포인터)에서 데이터를 읽는 루프 본문에 다음과 같은 코드 스 니펫이 있습니다. 이 잘못된 동작합니다에서내 코드가 QTcpSocket에서 사용할 수있는 바이트 수를 읽을 수없는 이유는 무엇입니까? 아이디어?
bytesAvailable: 24
true
bytesRead: 0
그리고 내 코드 :
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;
간헐적으로,이 다음에 가까운 무언가를 출력합니다. 이것은 나에게 매우 이상하게 보입니다. QTcpSocket이 어떻게 작동하는지 완전히 오해하고있는 것 같습니다. 확실히 bytesAvailable> 0이면 후속 읽기는 bytesAvailable 바이트를 버퍼로 읽을 수 있음을 의미합니다.이 경우 bytesRead는 == bytesAvailable이어야합니다. 또는 나는 무엇인가 놓치고 있냐? 현재의 추측은 어떤 종류의 메모리 손상 일 수 있다는 것입니다.
EDIT : 일부 nntp.errorString() 메시지를 표시하면이 실패 동안 "네트워크 작업 시간이 초과되었습니다"라는 메시지가 표시됩니다. 이게 무슨 뜻인지 조사해야 해 ... (아이디어?)
EDIT 2 : "네트워크 작업 시간 초과"는 읽기 시간 초과를 의미합니다. 코드가 (즉 간헐적으로) 작동해야 할 때, 나는 여전히이 '오류'를 얻습니다.
편집 3 : 위의 코드 스 니펫에 대한 전체 알고리즘 컨텍스트는 at this pastebin link입니다. this newer pastebin link
정말이 구조가 마음에 들지 않습니다 :'& buffer [0]'. 대신,'buffer = nntp-> readAll();'을 시도해보십시오. – Amartel
당신의 제안에 감사드립니다 Amartel하지만 QByteArray로 전환 한 다음 readAll을 수행하고 QByteArray의 크기를 사용하여 읽은 바이트 수를 결정하면 여전히 동일한 문제가 발생합니다 –