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 状态不正确的主要内容,如果未能解决你的问题,请参考以下文章
QT 使用 QTcpSocket来检测 ip 设备的网络状态