强制Qt使用ip4而不是ip6连接?

强制Qt使用ip4而不是ip6连接?,qt,ipv4,qnetworkaccessmanager,Qt,Ipv4,Qnetworkaccessmanager,当使用Qt的QNetworkAccessManager从IPv4端口上的服务执行HTTP GET时,但同一台计算机也具有IPv6功能(我们的服务不使用IPv6),在处理响应之前会有2秒以上的延迟。这就好像Qt试图先使用IPv6地址,然后超时,然后尝试IPv4,成功了 我想“通知”Qt只使用IPv4,以避免这种延迟 我使用的是Qt4.8,而Qt5目前不是一个选项 有没有办法“告诉”Qt只使用IPv4?或者以其他方式避免这种延误 bool float::doRequest(QString* resp

当使用Qt的QNetworkAccessManager从IPv4端口上的服务执行HTTP GET时,但同一台计算机也具有IPv6功能(我们的服务不使用IPv6),在处理响应之前会有2秒以上的延迟。这就好像Qt试图先使用IPv6地址,然后超时,然后尝试IPv4,成功了

我想“通知”Qt只使用IPv4,以避免这种延迟

我使用的是Qt4.8,而Qt5目前不是一个选项

有没有办法“告诉”Qt只使用IPv4?或者以其他方式避免这种延误

bool float::doRequest(QString* response, const QString& serverfunc, HttpPostData& postdata, int timeout) {
    *response="";
    bool ret=false;

    QString url = "http://" + _host + ":" + QString::number(_port) + "/license.txt";

    postdata["page"] = serverfunc;
    postdata["seed"] = stripChars(QUuid::createUuid().toString());

    QNetworkAccessManager manager;
    QEventLoop q;
    QTimer tT;

    tT.setSingleShot(true);
    connect(&tT, SIGNAL(timeout()), &q, SLOT(quit()));
    connect(&manager, SIGNAL(finished(QNetworkReply*)), &q, SLOT(quit()));

    QString postdata_string = mapToPostData(postdata);
    QString testurl = url + "?" + postdata_string;
    QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(testurl)));

    printf("Starting request. ");

    tT.start(timeout * 1000);
    q.exec();

    printf("Done!"); // 2+ seconds pass between "Starting request." and here when IPv6 is available on server

    if (tT.isActive()) {
        QByteArray data = reply->readAll();
        QTextStream out(&data);
        *response = out.readAll();
        tT.stop();
        ret=true;
    } else {
        // timeout
    }
    reply->close();
    q.quit();

    printf("Done.\n");

    // Other method
    //QString errormsg;
    //ret = SimpleNetworkOp::sendSynchronousPost("Trying...",url,postdata,response,&errormsg);

    delete reply; // clean-up

    return ret;
}

我通过切换到for网络请求“解决”了这个问题。它允许您非常轻松地指定IPv4与IPv6首选项


我意识到这不是我自己问题的正确答案,因为我问的是Qt,但这是我发现的最简单的解决方案,而且效果很好。这已经使用了一年多了,没有任何问题。

它没有回答您的问题,但您现在不应该开发一些无法使用IPv6的产品,如果它可用的话。如果主机没有在DNS中公布IPv6可访问性,或者如果您的本地系统没有可用的IPv6地址,则它将不会在任何情况下使用。另外,请开发当IPv6变得越来越部署时不会中断的软件,它已经很快地发生了。无论是谁投票,都要考虑:QT不允许你指定IPv4 vs IPv6。如果您有需要IPv4的遗留代码,并且需要将其指定为类型,那么Qt根本没有一个可行的解决方案。