QTcpSocket 状态不正确

Posted

技术标签:

【中文标题】QTcpSocket 状态不正确【英文标题】:QTcpSocket status is incorrect 【发布时间】:2014-07-18 18:11:21 【问题描述】:

我在 Linux Debian 上使用 Qt 4.8.2(64 位)。

我遇到了套接字状态的问题。我是连接服务器的客户端,我的相关代码 sn-p 是:

QTcpSocket *socket = new QTcpSocket(this);
socket->connectToHost(interface[cameras[listnum].interface].ip,interface[cameras[listnum].interface].port);
qDebug() << socket->waitForConnected(10000);
qDebug() << socket->isValid();
qDebug() << socket->state();

我正在连接到我本地的服务器,我可以断开与它的以太网电缆以测试连接和未连接状态。我可以通过等待时间判断我是否连接,如果电缆已连接到服务器,则 waitForConnected 需要不到 0.5 秒,如果未连接电缆,则 waitForConnected 在 10 秒后超时。

我的问题是我是否获得了相同的连接状态。 qDebug 的输出是:

是的

QAbstractSocket::UnconnectedState

无论我是否真的连接,它都会保持这种状态。连接后,我可以发送数据。我还将最后两条语句放在命令按钮中,并验证返回状态即使在几秒钟或几分钟后也不会改变。

任何能指引我正确方向的帮助将不胜感激。

【问题讨论】:

【参考方案1】:

首先,检查套接字是否有效是没有意义的,它是您感兴趣的状态。

如果如您所见,waitForConnected 返回 false,那么您可以确定 state 也未连接 - 没有必要进一步检查它。

当连接成功时,waitForConnected 应该返回 true,state 应该返回连接状态。 state 可能只有在您耗尽剩余事件后才会变为 true,尽管这将是 Qt 4.8.2 的怪癖(您不能尝试 4.8.5 或 5.3.1 吗?)。

我对你所描述的事情是否真的发生持怀疑态度,但如果真的发生了,你需要先说服我们。编写一个自包含的测试用例(单个 main.cpp 文件),将其编辑到您的问题中,验证它在 Qt 4.8.5 上是否仍然发生,然后提交错误报告。

【讨论】:

感谢您的回复。 qDebug 仅用于当前诊断,不会出现在最终代码中,它们显示不正确的状态。在另一段代码中,我通过这个套接字发送数据,并且 state() 仍然返回 UnconnectedState。我必须完成我目前的项目,然后我会按照你的建议来证明错误。我已经通过 waitForConnected 的定时响应来解决问题,然后将我自己的标志设置为连接状态,它可以工作。再次感谢。 至少使用 Qt 4.8.5 尝试一下。 @Kuba ober .. windless1015 的这个回答有意义吗? 我不使用同步 API,所以我真的不知道这样的 hack 是否“有意义”。对我来说,使用 Qt 的全部意义在于它是开源的,您可以轻松地构建、调试和修改它。这比处理黑客和变通方法要容易得多。在所有可怕的开源项目中,构建 Qt 是最简单的,值得一提。我认为没有理由避免这种情况。

以上是关于QTcpSocket 状态不正确的主要内容,如果未能解决你的问题,请参考以下文章

QTcpSocket 问题

QTcpSocket 的状态

QTcpSocket 无法绑定到正确的 IP

QT 使用 QTcpSocket来检测 ip 设备的网络状态

同一对象中的 QTcpSocket 到 QTcpSocket

为啥 QTcpSocket 不发出信号?