c++ - 无法为 Qt 的 waitForConnected 设置超时

标签 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 中获得的(超时是 QLineEdit):

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

最佳答案

来自Qt documentation for QAbstractSocket :

Waits until the socket is connected, up to msecs milliseconds. If the connection has been established, this function returns true; otherwise it returns 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 文档):

Note: This function may fail randomly on Windows. Consider using the event loop and the connected() signal if your software will run on Windows.

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

关于c++ - 无法为 Qt 的 waitForConnected 设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27114008/

相关文章:

c++ - "Large"使用C++ Qt和Qt Xlsx模块读取xlsx文件

java - 强制应用等待发送新短信

C++ 控制台应用程序提示 "Run as Admin"以管理员身份运行?

c++ - 为什么不允许通过 decltype(lamda) 定义对象,我该如何改进它?

c++ - 如何使用 QFileSystemWatcher 监视文件夹的更改

带有 fork 的子进程

java - 等待和通知不是静态的

c++ - 没有实现的构造函数定义?

c++ - GLFW/glfw3.h 包含失败

macos - 在OSX 10.10的Qt5中找不到OpenCV库