无法为 Qt 的 waitForConnected 设置超时
Can't set timeout for Qt's waitForConnected
我正在尝试使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 秒进行连接,但如果之前已经建立连接,它会直接返回。
相关文章:
- 没有找到相关文章