使用Qt的QNetworkAccessManager从IPv4端口上的服务执行HTTP GET,但同一台计算机还具有IPv6功能(我们的服务不使用) ),在处理响应之前有2秒的延迟。好像Qt首先尝试使用IPv6地址,然后超时,然后尝试使用IPv4,这是成功的。
我想通知' 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;
}
答案 0 :(得分:-1)
我通过切换到Chilkat's HTTP library来解决网络请求问题。它允许您非常轻松地指定IPv4与IPv6的偏好。
我意识到这不是我自己问题的正确'答案',因为我问的是Qt,但这是我发现最简单的解决方案,而且效果很好。这已经使用了一年多了,根本没有问题。