无法为Qt的waitForConnected设置超时

时间:2014-11-24 20:56:11

标签: c++ qt wait

我正在尝试在我的Qt应用程序中定制连接超时,但无论我将哪个数字作为参数传递给waitForConnected,超时都是相同的(它大约是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我从QLineEdit那里获得(Timeout is QLineEdit):

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

3 个答案:

答案 0 :(得分:3)

来自Qt documentation for QAbstractSocket

  

等待套接字连接,最多毫秒毫秒。如果已建立连接,则此函数返回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上运行吗?

答案 1 :(得分:1)

我通常这样做:

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秒。

答案 2 :(得分:0)

方法返回true还是false?如果返回true,则表明已建立连接。 根据文档,waitForConnected()等待连接最多30秒,但如果之前已建立连接,则直接返回。