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 を実行すると、すべてが機能しました。

これを恒久的に修正するために、chmod を /usr/libexec/udhcpc.sh に追加して、作成時に /etc/resolve.conf の権限が正しく設定されるようにしました。

于 2013-08-09T06:15:15.397 に答える