无法为 Qt 的 waitForConnected 设置超时

Can't set timeout for Qt's waitForConnected

本文关键字:waitForConnected 设置 超时 Qt      更新时间:2023-10-16

我正在尝试使Qt应用程序中的连接超时可自定义,但是无论我传递什么数字作为参数来等待连接,超时都是相同的(大约是3秒,而不是默认的30秒)。

例:

if(socket->waitForConnected(koko))
{
    ...do stuff...
}
else
{
    ...do else stuff...
}

无论我将 koko 设置为哪个数字,超时都在 3 秒左右。我做错了什么?

我的插座连接:

socket = new QTcpSocket();
socket->connectToHost(addres,port);

哪里:

QHostAddress addres, quint16 port

和koko im从QLineEdit获得这样的(超时是QLineEdit):

int koko = ui->Timeout->text().toInt()*1000;

来自 QAbstractSocket 的 Qt 文档:

等待直到套接字连接完毕,最长为毫秒毫秒。如果已建立连接,则此函数返回 true;否则返回 false。

您说该方法在大约 3 秒后返回 false。这可能是正常行为。请参阅此代码:

#include <QTcpSocket>
#include <QTime>
int main(int, char *) {
    QStringList hosts;
    hosts << "127.0.0.1" << "10.1.25.62" << "192.168.1.0";
    for(QString host : hosts) {
        QTime timer;
        timer.start();
        QTcpSocket socket;
        socket.connectToHost(host, 80);
        if(socket.waitForConnected(30000)) {
            qDebug() << host << "-- Connected in" << timer.elapsed();
        } else {
            qDebug() << host << "-- NOT Connected in" << timer.elapsed();;
        }
    }
}

结果是:

"127.0.0.1" -- NOT Connected in 1
"10.1.25.62" -- NOT Connected in 5997 
"192.168.1.0" -- NOT Connected in 30020

在所有情况下,waitForConnected() 方法都返回 false。

  • 首先,地址 (127.0.0.1) 可访问,但端口已关闭:连接立即失败。
  • 然后,该地址存在(在同一网络上),但需要更多时间才能检测到端口已关闭。6 秒后失败(大约)
  • 最后,无法访问
  • 192.168.1.0,因此需要完全超时才能确保连接失败。

请记住另一个重要信息(仍然来自Qt文档):

注意:此功能可能会在Windows上随机失败。如果您的软件将在 Windows 上运行,请考虑使用事件循环和 connected() 信号。

这也可能是您的问题。你在Windows上运行吗?

我通常这样做:

int iTrial=0;
int iMaxTrials=200;
int iTimeOut=20;
do {
    pTcpSocket->connectToHost(QHostAddress::LocalHost,uPort);
} while (!pTcpSocket->waitForConnected(iTimeOut) && ++iTrial < iMaxTrials);

它会主动尝试连接 4 秒钟。您可能希望将参数更改为例如超时=200;maxtrials=150 等待 30 秒。

该方法返回的是真还是假?如果返回 true,则表示已建立连接。根据文档,waitForConnected() 最多等待 30 秒进行连接,但如果之前已经建立连接,它会直接返回。

相关文章:
  • 没有找到相关文章