我正在尝试在我的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;
答案 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。
请记住另一个重要信息(仍然来自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秒,但如果之前已建立连接,则直接返回。