2

我使用 Qt 4.8 中的演示代码作为基础向我的应用程序添加了一个简单的浏览器页面:[QTDIR]\demos\browser

这在 Windows 中运行良好,但是当我重建应用程序并在我的嵌入式 Linux 设备上尝试它时它失败了。在试验时,我发现我可以通过解析 IP 地址并使用它来加载 www.google.com。我在我的应用程序中添加了以下代码:

QHostInfo hostInfo = QHostInfo::fromName(m_url);
if (hostInfo.error() != QHostInfo::NoError)
{
    qDebug() << "Lookup failed:" << hostInfo.errorString();
}
foreach (QHostAddress hostAdd, hostInfo.addresses())
{
    qDebug() << "Found address:" << hostAdd.toString();
}

这会输出错误“名称解析中的临时故障”。所以在我尝试过的设备上:

  1. 检查 /etc/resolv.conf - 看起来不错。
  2. 检查我的网关出现在“route -n”中 - 看起来不错。
  3. 试过“ping 8.8.8.8” - 工作正常。
  4. 试过“nslookup www.google.com” - 工作正常。
  5. 尝试“wget http://www.google.com ” - 正确加载 index.html。

我只能想象 Qt 正在使用不同的方法来解析 DNS 地址,但我不知道它可能是什么。

4

1 回答 1

1

事实证明,“名称解析中的临时失败”是错误 EAI_AGAIN,当 getaddrinfo() 并不真正知道问题出在哪里时,它会返回该错误。它失败了,因为我以 root 身份运行 nslookup,但应用程序在用户帐户下运行,并且错误地只有 root 具有 /etc/resolv.conf 的读取权限。一旦我做了一个 chmod 一切正常。

为了永久解决这个问题,我们向 /usr/libexec/udhcpc.sh 添加了一个 chmod,以便在 /etc/resolve.conf 创建时正确设置它的权限。

于 2013-08-09T06:15:15.397 回答