强制 Qt 使用 ip4 而不是 ip6 连接?
Posted
技术标签:
【中文标题】强制 Qt 使用 ip4 而不是 ip6 连接?【英文标题】:Force Qt to connect using ip4 instead of ip6? 【发布时间】:2014-04-22 02:26:06 【问题描述】:当使用 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;
【问题讨论】:
它不能回答你的问题,但你现在不应该开发不能使用 IPv6 的东西(如果可用的话)。如果主机没有在 DNS 中通告 IPv6 可达性,或者如果您的本地系统没有可用的 IPv6 地址,那么它无论如何都不会被使用。否则,请开发在 IPv6 部署越来越多时不会中断的软件,这已经非常迅速地发生了。 【参考方案1】:我通过切换到Chilkat's HTTP library 来处理网络请求,“解决了”这个问题。它让您可以非常轻松地指定 IPv4 与 IPv6 首选项。
我意识到这不是我自己问题的正确“答案”,因为我问的是 Qt,但这是我发现的最简单的解决方案,而且效果很好。这已经使用了一年多了,一点问题都没有。
【讨论】:
无论谁投反对票,请考虑这一点:Qt 不允许您指定 IPv4 与 IPv6。如果您有需要 IPv4 的遗留代码,并且需要将其指定为类型,那么 Qt 根本没有可行的解决方案。以上是关于强制 Qt 使用 ip4 而不是 ip6 连接?的主要内容,如果未能解决你的问题,请参考以下文章