2013-05-14 1 views
0

나는 다음과 같이 QScopedPointer에 QAbstractSocket를 저장 관련 일부가 Qt4.8.3를 사용하여 블랙 베리 플레이 북을위한 네트워크 기반의 응용 프로그램을 개발하고 는 SSL 경로를 아래로 갈 때 (비 SSL 작동 미세!)QScopedPointer 내에 QSslSocket을 저장하려고 할 때 bps_remove_fd 오류가 발생하는 이유는 무엇입니까?</p> 내 구현에서 <pre><code>QScopedPointer<QAbstractSocket> nntp; </code></pre> <p>, 나는 QSslSocket 또는 중 하나를 저장 :

if(ssl) { 
    nntp.reset(new QSslSocket(this)); 
    (dynamic_cast<QSslSocket*>(nntp.data())))->connectToHostEncrypted(server, port); 
} else { 
    nntp.reset(new QTcpSocket(this)); 
    nntp->connectToHost(server, port); 
} 

QTcpSocket (둘은 QAbstractSocket에서 상속) 즉, conenction 암호화 할 것인지 여부에 따라, 나는 다음과 같은 실행으로 끝날 시간 오류 :

가상 무효 QEventDispatcherBlackberry :: unregisterSocketNotifier (QSocketNotifier *) bps_remove_fd()는 오류가 오류 설명과 다른 플랫폼에서 코드가 예상대로 작동한다는 사실 주어진 아마 블랙 베리 관련이

19 실패 (Mac 및 Linux에서 테스트) . (숫자 19는 파일 설명자를 나타냅니다.

이 오류가 나타나는 이유와 해결책은 무엇입니까?

감사합니다.

Ben.

편집 : 방금 포인터를 사용하는 대신 단일 QSslSocket을 가질 수 있고 비 SSL 모드 일 때 일반 QTcpSocket으로 처리 할 수 ​​있습니다. 훨씬 쉽습니다. 그러나 여전히 위의 오류에 대한 이유를 알고 싶습니다

답변

0

어떤 일이 일어나고 있는지 보려면 the source code을 참조하십시오.

void QEventDispatcherBlackberry::unregisterSocketNotifier(QSocketNotifier *notifier) 
{ 
    // Unregister the fd with bps 
    int sockfd = notifier->socket(); 
    int result = bps_remove_fd(sockfd); 
    if (result != BPS_SUCCESS) 
     qWarning() << Q_FUNC_INFO << "bps_remove_fd() failed"; 

    // Allow the base Unix implementation to unregister the fd too 
    QEventDispatcherUNIX::unregisterSocketNotifier(notifier); 
} 

그리고 말한다 bps_remove_fd 문서와의 상관 관계 수행합니다 : unregisterSocketNotifier의 소스 코드는 bps_remove_fd을 할 수 있는지에 대한

If the file descriptor is present it is removed from the channel. The io_handler callback and associated user data are also removed.

[returns] BPS_SUCCESS if the fd (file descriptor) was successfully removed from the channel, BPS_FAILURE with errno value set otherwise.

유일한 단서는 fd이, 존재하지 않는 가능성있는 실패를하는 소켓에 유효한 파일 기술자가 없다는 것을 의미합니다. 다른 오류는 지정되지 않은 이유에 상관없이 파일이 있지만 제거되지 않은 것일 수 있습니다.

변수를 errno으로 설정해야합니다.보기에는 더 자세한 오류 설명이있을 수 있습니다. 시도하지는 않았지만 걸리는 것이 없습니다.

bps_remove_fd은 POSIX의 close(int fd)과 동일한 원리로 작동하므로 close's documentation에서 어떤 오류가 발생할 수 있는지 확인했습니다.

  • 인수가 유효한 파일 설명자가 아닙니다 (실패해야 함).
  • close은 신호로 중단 될 수 있습니다 (실패해야 함).
  • 파일 시스템에서 읽거나 쓰는 동안 I/O 오류가 발생했습니다 (실패 할 수 있음).
나는 그것이 정말 특별한 경우의 질문에 대답하지 않기 때문에이 코멘트에 대답 만들었을 것입니다,하지만 난 그게 최소한의 도움이 조금에 무슨 일이 일어나고 있는지 이해할 수 희망

더 :

+0

감사합니다 Morwenn - 정말 포괄적입니다! 편집에서 언급했듯이 QSslSocket을 사용하여 QScopedPointer에 QAbstractPointer를 저장하고 SSL 요구 사항에 따라 다시 설정하는 대신 QSslSocket을 사용하여 QTcpSocket으로 처리 할 수 ​​있다는 사실을 알게되었습니다. 이것은 위의 문제를 완화하는 것으로 보인다 –

+0

@BenJ 듣기 좋은데 :) – Morwenn