QTcpSocket.connectToHost() 耗时过长

Posted

技术标签:

【中文标题】QTcpSocket.connectToHost() 耗时过长【英文标题】:QTcpSocket.connectToHost() takes too long time 【发布时间】:2018-01-30 15:29:55 【问题描述】:

这是我与自定义 TcpServer 连接的代码。结果 connectiontoHost() 在 13.5 秒内完成(有时在 2.5 秒内)。 与本地服务器的连接非常快。 与远程服务器相同的代码,但在 Qt5.7 上运行非常快。

bool cuTcpSocketIOInterface::pInitialize()

    QTcpSocket* tSocket = new QTcpSocket(this);
    QElapsedTimer timer;
    timer.start();
    if (!isSocketReady())
       qDebug()<<"connectToHost" <<address()<<port()<<", Time:"
               <<timer.elapsed();
       tSocket->connectToHost(address(), port());
    
    qDebug()<<"Done:"<<timer.elapsed();
    tSocket->waitForConnected(100);
    return tSocket->state() == QAbstractSocket::ConnectedState;

接下来是这个函数在 std::out 中与远程服务器的输出:

connectToHost QHostAddress("192.168.255.193") 9876 , Time: 0
Done: 13581

与自定义本地服务器的连接

connectToHost QHostAddress("127.0.0.1") 9876 , Time: 0
Done: 5

对我的自定义远程服务器的 Ping 非常好(不到 1 毫秒)。与putty的连接非常快。

更新 所以,我尝试使用 Qt5.7 和 Qt 5.9.1。我得到下一个结果: 我的代码:

#include <QCoreApplication>
#include <QDebug>
#include <QTcpSocket>
#include <QElapsedTimer>

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    qDebug()<<"START TEST!!!";
    QElapsedTimer timer;
    timer.start();

    QTcpSocket socket;
    socket.connectToHost(TcpIpAddress,80);
    qDebug()<<"connectToHost Done:"<<timer.elapsed();

    return a.exec();

在 Qt 5.7.1 上:

START TEST!!!
connectionToHost Done:7

在 Qt 5.9 上:

START TEST!!!
connectionToHost Done:2572

看起来像是 BugReport 的借口?

更新: Qt 5.10.1

START TEST!!!
connectionToHost Done:2574

【问题讨论】:

qDebug()&lt;&lt;"Done:"&lt;&lt;timer.elapsed();放在waitForConnected之后,否则没有意义 好的,添加了bool result = tSocket-&gt;waitForConnected(100); qDebug()&lt;&lt;"Connected:"&lt;&lt;result&lt;&lt;"Time:"&lt;&lt;timer.elapsed();。结果:connectToHost QHostAddress("192.168.255.193") 9876 , Time: 0 Done: 13582 Connected: true Time: 13583 很有可能是您的 DNS 服务器查找缓慢。看看Wireshark,它可能会给你一些线索 我尝试使用 WireShark。调用该程序后,需要2.5-14秒,然后在输出连接成功的同时,发送的数据包上会出现信息 尝试编写对套接字状态变化做出反应的异步代码,而不是像上面写的那样同步代码。 【参考方案1】:

解决方案: 连接服务器前需要设置代理: socket.setProxy(QNetworkProxy::NoProxy)

【讨论】:

以上是关于QTcpSocket.connectToHost() 耗时过长的主要内容,如果未能解决你的问题,请参考以下文章