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