2012-07-20 3 views
4

ftp 서버가 인증을 요구할 경우 QNetworkAccessManager가 ftp가 검색 한 누락 된 파일을 처리하지 않는 것으로 보입니다.QNetworkAccessManager 백엔드를 재설정하는 방법

상황은 다음과 같습니다. 사용자 이름과 암호가 필요한 동일한 ftp 서버에서 여러 파일을 다운로드 중입니다. 성공적으로 몇 파일을 다운로드 한 다음 존재하지 않는 파일에 대해 GET을 보냅니다. 이 요청은 실패를보고합니다. 그런 다음 유효해야하는 파일에 대한 GET 요청을 보냅니다. 이 요청은 완료된 신호 또는 오류를 방출하지 않습니다.

Qt 4.7.4

도와주세요! 이것은 나를 미치게합니다. 나는 어떻게 든 ftp 백엔드를 리셋 할 수 있다면,이 문제는 해결할 수 있다고 생각한다.

+0

여기에 몇 가지 샘플 코드가 있습니다. https://gist.github.com/3153709 – IslandCow

+0

재설정을 위해 QNAM을 '삭제'하고 새 것을 생성 할 수 있습니다 ('QNetworkReply :: fininshed'가 생성됩니다). 또한,'NetworkHandler :: finished()'에서'reply-> deleteLater()'를 잊지 마라. 브라우저로 잘못된 파일을 다운로드하려고하면 어떻게됩니까? (문제가 해결되면 버스터의 답변을 수락하십시오.) – elmigranto

답변

1

이 같은 QNetworkReply 신호 finished()를 연결 :

QObject::connect(reply, SIGNAL(finished()), netty, SLOT(finished())); 

대신이 같은 QNetworkAccessManager에서 완성 된 신호를 시도 : 당신이해야합니다

connect(&network, SIGNAL(finished(QNetworkReply *)), netty, SLOT(finished(QNetworkReply *))); 

주에 대한 프로토 타입을 변경하려면 완료() 슬롯.

void check(QNetworkReply *reply){ 
if(reply != NULL){ 
    if(reply->isFinished()) 
    finished(reply); 
    else 
    reply->abort(); 
} 
} 

그리고이 버그의 인식 :

https://bugreports.qt-project.org/browse/QTBUG-3443

0

내가 같은 상황을 겪고있어

마지막 방법은이 같은 함수를 호출하는 타이머를 설정하는 것입니다 Qt 5.3.0 (아직 베타 버전은 괜찮지 만 Qt5.2.x에서 같은 버그가 재현되었다고 생각합니다).

QNetworkAccessManager는 ftp에 대해 fileNotFound 오류를 올바르게보고하지만 결코 복구하지 못합니다. 이후의 모든 ftp 요청은 동일한 오류 메시지와 함께 실패합니다.

(존재하지 않는) badFile.txt를 가져 오려고합니다. file2.txt를 찾을 수 없다는 올바른 메시지가 나타납니다. 우리는 다음 (존재하는) goodFile.txt에 액세스하려고하면 우리는 이전 오류가 영원히 QNetworkAccessManager에 갇혀 유지할 것으로 보인다

Error while downloading ftp://ftp.url.com/goodFile.txt: 
Downloading file failed: 
Can't open /badFile.txt: No such file or directory" 

를 얻을.

저에게 도움이되는 유일한 해결책은 ftp를 찾을 수 없음 오류가 발생할 때마다 새 QNetworkAccessManager를 삭제하고 작성하는 것입니다. 이는 단순히 QNetworkReply 오류 (QNetworkReply :: NetworkError) 신호에 연결하여 수행됩니다. elmigranto가 말했듯이, 완성 된 신호는 각 요청에 대해 출력됩니다. 이것은 분명히 QNetworkAccessManager가 단일 요청을 처리하는 경우에만 작동 할 수 있습니다. 그렇지 않으면 동일한 매니저가 처리하는 병렬 요청을 중단하지 않도록 특별한주의를 기울여야합니다.

QNetworkAccessManager 완료 (QNetworkReply *) 및 QNetworkReply finished() 신호는 정확히 동일한 작업을 수행합니다. Qt 문서에 명시된 바와 같이이 두 신호는 함께 방출됩니다. 이것은 버스터가 말한 것처럼이 문제에 대한 해결책이 아닙니다.

타이머 설정은 다른 용도 (예 : 연결 시간 제한)에 유용 할 수 있지만이 특정 문제도 해결되지 않습니다.

관련 문제