2014-04-22 30 views
0

當使用Qt的QNetworkAccessManager從IPv4端口上的服務執行HTTP GET時,但同一臺計算機也有具有IPv6功能(我們的服務不使用該功能)時,在響應處理前有一個2秒延遲。就好像Qt試圖先使用IPv6地址,然後超時,然後嘗試使用IPv4,即成功。強制Qt連接使用ip4而不是ip6?

我想'通知'Qt只使用IPv4,以避免這種延遲。

我正在使用Qt 4.8並且現在不使用Qt 5。

有沒有辦法'告訴'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; 
} 
+4

它不回答你的問題,但你現在不應該開發一些現在不能使用IPv6的東西,如果它可用的話。如果主機不在DNS中通告IPv6可達性,或者如果您的本地系統沒有可用的IPv6地址,那麼它將不會被使用。否則,請開發在IPv6部署越來越多時不會中斷的軟件,這種情況已經很快發生了。 –

回答

-1

我通過切換到Chilkat's HTTP library網絡請求「解決」問題。它可讓您非常輕鬆地指定IPv4與IPv6首選項。

我意識到這不是對我自己的問題的正確「回答」,因爲我問的是Qt,但它是我找到的最簡單的解決方案,並且效果很好。這已經使用了一年多了,完全沒有問題。

+0

不管誰投降,請考慮這一點:Qt *不允許你指定IPv4與IPv6 *。如果您的傳統代碼需要IPv4,並且您需要將其指定爲類型,那麼Qt根本沒有可行的解決方案。 –