我正在使用Qt4.8.3为黑莓playbook开发一个基于网络的应用程序,其中的一部分涉及在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指的是文件描述符)。
你知道为什么我会看到这个错误,以及我如何修复它吗?
谢谢,
本。
编辑:我刚刚意识到,在非ssl模式下,我可以只有一个QSslSocket,并将其视为常规QTcpSocket,而不是使用指针。简单多了。然而,我仍然想知道上述错误的原因
发布于 2013-05-15 17:27:25
我们可以看看the source code,看看发生了什么。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回调和关联的用户数据也将被删除。
如果成功地从通道中删除了fd (文件描述符),则返回BPS_SUCCESS;否则返回BPS_FAILURE,否则设置errno值。
关于导致bps_remove_fd失败的唯一线索是fd不存在的可能性,这意味着套接字没有任何有效的文件描述符。另一个错误可能是,由于任何未指定的原因,文件存在但未被删除。
应该设置变量errno,所以如果你查看它,你可能会有一个更完整的错误描述-我没有尝试过,我没有-所需的东西。
我敢打赌,bps_remove_fd的工作原理与POSIX的close(int fd)相同,所以我查看了一下close's documentation,看看是什么导致了失败。它指出,在以下情况下,它将失败/可能失败:
我会将这个答案作为一个评论,因为它并没有真正回答您的特定情况下的问题,但我希望它至少可以帮助您更多地了解发生了什么:)
https://stackoverflow.com/questions/16538408
复制相似问题