首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在尝试将QSslSocket存储在QScopedPointer中时会出现bps_remove_fd故障?

为什么在尝试将QSslSocket存储在QScopedPointer中时会出现bps_remove_fd故障?
EN

Stack Overflow用户
提问于 2013-05-14 16:30:06
回答 1查看 145关注 0票数 0

我正在使用Qt4.8.3为黑莓playbook开发一个基于网络的应用程序,其中的一部分涉及在QScopedPointer中存储QAbstractSocket,如下所示:

代码语言:javascript
复制
QScopedPointer<QAbstractSocket> nntp;

在我的实现中,我根据连接是否要加密来存储QSslSocket或QTcpSocket (两者都继承自QAbstractSocket),即,

代码语言:javascript
复制
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指的是文件描述符)。

你知道为什么我会看到这个错误,以及我如何修复它吗?

谢谢,

本。

编辑:我刚刚意识到,在非ssl模式下,我可以只有一个QSslSocket,并将其视为常规QTcpSocket,而不是使用指针。简单多了。然而,我仍然想知道上述错误的原因

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 17:27:25

我们可以看看the source code,看看发生了什么。unregisterSocketNotifier的源码如下:

代码语言:javascript
复制
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回调和关联的用户数据也将被删除。

如果成功地从通道中删除了fd (文件描述符),则返回BPS_SUCCESS;否则返回BPS_FAILURE,否则设置errno值。

关于导致bps_remove_fd失败的唯一线索是fd不存在的可能性,这意味着套接字没有任何有效的文件描述符。另一个错误可能是,由于任何未指定的原因,文件存在但未被删除。

应该设置变量errno,所以如果你查看它,你可能会有一个更完整的错误描述-我没有尝试过,我没有-所需的东西。

我敢打赌,bps_remove_fd的工作原理与POSIX的close(int fd)相同,所以我查看了一下close's documentation,看看是什么导致了失败。它指出,在以下情况下,它将失败/可能失败:

  • 该参数不是有效的文件描述符(应失败)。
  • 从文件系统读取或写入文件系统时发生I/O错误(可能失败)。

我会将这个答案作为一个评论,因为它并没有真正回答您的特定情况下的问题,但我希望它至少可以帮助您更多地了解发生了什么:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16538408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档