Qt:QTcpSocket 的默认连接超时

Posted

技术标签:

【中文标题】Qt:QTcpSocket 的默认连接超时【英文标题】:Qt: default connection timeout for QTcpSocket 【发布时间】:2014-08-16 21:08:18 【问题描述】:

请告知如何在不使用阻塞 waitForConnected() 方法的情况下设置默认连接超时?我注意到套接字在大约 60 秒后发出错误信号(QAbstractSocket::SocketTimeoutError),我可以将其处理为超时,但是可以调整此超时吗?

【问题讨论】:

嗨,我认为没有其他解决方案。您可以调整 waitForConnected() 但如果您不希望此函数阻塞(可能是因为 GUI 或其他原因),您应该使用线程。 没错,因为 GUI 阻塞。我想为套接字建立持久连接,但我不知道如何用线程来做。如果我只是转到线程 waitForConnected() 调用,它会在控制台中显示一个输出“无法为不同线程中的父级创建子级”,但没有任何明确的对象创建,只需调用 waitForConnected。 【参考方案1】:

你可以使用QTimer:

致电connectToHost后启动。 您可能希望在套接字状态从 QAbstractSocket::HostLookupState to QAbstractSocket::ConnectingState 更改时重置计时器,如果您希望更细粒度地控制超时的确切时间,则可能需要不同的超时时间。 如果您获得连接,请停止计时器,或将其重置以用于类似的发送/接收超时用途。 如果您遇到计时器超时,请执行 disconnectFromHost() 并可能在您收到断开连接信号时执行类似重试之类的操作。

在开发时,请确保至少将stateChanged(...)error(...) 信号连接到调试槽,它只打印参数。这样一来,当事情以您未预料到的方式发生时,您就会看到。

【讨论】:

是的,现在我用 QObject 的 startTimer() 来实现它。所以我现在可以接受这个答案。

以上是关于Qt:QTcpSocket 的默认连接超时的主要内容,如果未能解决你的问题,请参考以下文章

请问浏览器一直显示连接超时到底是啥原因

网络出现连接超时怎么解决?

Qt:设计QtcpSocket连接多个TcpServer?

mysql长时间不操作会不会连接超时?怎么改?

keepalived下,mysql连接超时

jedis 连接超时后还需要关闭吗