0

Qt4.8.3 を使用して、blackberry プレイブック用のネットワーク ベースのアプリを開発しています。その一部には、次のように QScopedPointer に QAbstractSocket を格納することが含まれます。

QScopedPointer<QAbstractSocket> nntp;

私の実装では、接続を暗号化するかどうかに応じて、QSslSocket または QTcpSocket (どちらも QAbstractSocket から継承) を格納します。

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);
}

ssl ルート (非 ssl は正常に動作します!) を下ると、次の実行時エラーが発生します。

virtual void QEventDispatcherBlackberry::unregisterSocketNotifier(QSocketNotifier*) bps_remove_fd() 失敗 19

エラーの説明と、コードが他のプラットフォームで期待どおりに機能するという事実 (Mac と Linux でテスト済み) を考慮すると、エラーはおそらくブラックベリーに関連しています。(19 という数字はファイル記述子を指すことに注意してください)。

このエラーが表示される理由と修正方法を教えてください。

ありがとう、

ベン。

編集:ポインターを使用する代わりに、単一の QSslSocket を使用して、非 ssl モードのときに通常の QTcpSocket として扱うことができることに気付きました。はるかに簡単です。上記のエラーの理由を知りたいのですが、

4

1 に答える 1

0

何が起こっているかを確認するために、ソースコードを見ることができます。のソースコードunregisterSocketNotifierは次のとおりです。

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ドキュメントとの関連付けを行います。

ファイル記述子が存在する場合は、チャネルから削除されます。io_handler コールバックと関連するユーザー データも削除されます。

[戻り値] BPS_SUCCESSfd (ファイル記述子) がチャネルから正常に削除された場合、それ以外のBPS_FAILURE場合は errno 値が設定されます。

何がbps_remove_fd失敗するかについての唯一の手がかりfdは、存在しない可能性です。これは、ソケットに有効なファイル記述子がないことを意味します。その他のエラーは、指定されていない理由で、ファイルは存在するが削除されていない可能性があります。

変数errnoを設定する必要があるため、それを見ると、より完全なエラーの説明が得られる場合があります-試していませんが、必要なものがありません-.

はPOSIXbps_remove_fdの と同じ原理で動作するに違いclose(int fd)ないので、closeのドキュメントを見て、失敗の原因を確認しました。次の場合に失敗する必要がある/失敗する可能性があると述べています。

  • 引数は有効なファイル記述子ではありません (失敗する必要があります)。
  • close信号によって中断される可能性があります (失敗する必要があります)。
  • ファイル システムの読み取りまたは書き込み中に I/O エラーが発生しました (失敗する可能性があります)。

あなたの特定のケースの質問に実際には答えていないので、この回答をコメントにしましたが、少なくとも何が起こっているのかをもう少し理解するのに役立つことを願っています:)

于 2013-05-15T09:27:25.410 に答える