1

Arduino イーサネット ライブラリを使用して小さなプロジェクトを構築しようとしていますが、奇妙な DNS の問題が発生しています。

ネットワークに対してローカルなドメイン名は解決できませんが、パブリック ドメイン名の解決には問題はありません

ネットワーク上の他のシステムでは、これらのローカル ドメイン名に問題はありません。どうやらArduinoのようです。

これが私が使用しているものです:

ここに私のテストスケッチがあります:

#include <SPI.h>
#include <Ethernet.h>
#include <Dns.h>
#include <EthernetUdp.h>

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };

EthernetClient client;

void setup() {
  Serial.begin(9600);

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    while(true);
  }

  delay(1000);
  Serial.println("connecting...");
  DNSClient dnsClient;

  // Router IP address
  byte dnsIp[] = {192, 168, 11, 1};

  dnsClient.begin(dnsIp);

  // Regular DNS names work...
  IPAddress ip1;
  dnsClient.getHostByName("www.google.com", ip1);
  Serial.print("www.google.com: ");
  Serial.println(ip1);

  // However local ones defined by my router do not (but they work fine everywhere else)...
  IPAddress ip2;
  dnsClient.getHostByName("Tycho.localnet", ip2);
  Serial.print("Tycho.localnet: ");
  Serial.println(ip2);
}

void loop() {

}

その出力は次のとおりです (2 番目の IP アドレスは正しくありません)。

connecting...
www.google.com: 74.125.227.84
Tycho.localnet: 195.158.0.0

同じネットワークに接続された Linux マシンから得られた正しい情報は次のとおりです。

$ nslookup www.google.com
Server:         192.168.11.1
Address:        192.168.11.1#53

Non-authoritative answer:
Name:   www.google.com
Address: 74.125.227.80
Name:   www.google.com
Address: 74.125.227.84
Name:   www.google.com
Address: 74.125.227.82
Name:   www.google.com
Address: 74.125.227.83
Name:   www.google.com
Address: 74.125.227.81

$ nslookup Tycho.localnet
Server:         192.168.11.1
Address:        192.168.11.1#53

Name:   Tycho.localnet
Address: 192.168.11.2

どうしたの?

4

2 に答える 2

2

すでに解決策を見つけたかどうかはわかりませんが、念のため:

inet_atonDNS ライブラリの一部に欠陥があります。

これは、文字列 IP アドレスを IPAddress タイプに変換することになっています。

それを調べるには、文字列内の各文字を数字でテストします。

while (*p &&
       ( (*p == '.') || (*p >= '0') || (*p <= '9') ))

ただし、任意のアルファベット文字が一致します*p >= '0'

そのはず:

while (*p &&
       ( (*p == '.') || ((*p >= '0') && (*p <= '9')) ))

でこれを変更する必要がありますDns.cpp

于 2014-08-22T08:00:18.800 に答える
0

多くのルーターは、LAN 側の IP アドレスを DNS アドレスとして提供します。これは、DHCP セットアップの一般的な動作です。これは必ずしもそれらが実際にサーバーであることを意味するわけではありません。単純に DNS 要求を WAN 側のサーバーに転送し、応答を返すものもあります。ルーターがプロキシのみであるこのタイプの構成は、あなたの症状を説明しています。

ルーターがプロキシの場合、Arduino DNS 要求は、ローカル名を知らない外部 DNS サーバーに転送されます。

Linux マシンは、他のネットワーク プロトコルを使用してローカル名を検出しています。ローカル コンピューター名がわかっている Windows マシンでも同じことが起こります。Wireshark のようなネットワーク モニタを実行すると、コンピュータが他のコンピュータに自分の存在を定期的にアナウンスすることがわかります。Arduino には単純な TCP/IP しかなく、これらのブロードキャストは処理されません。

ルーターが本当にサーバーである場合は、名前から IP アドレスへのマッピングのエントリを含むテーブルを構成する必要があります。これを機能させるために、動的アドレスを使用することはできません。なぜなら、ある日テーブルに入力した内容が別の日には無効になるからです。ローカル DNS サーバーを DHCP で動作させるには、特定の MAC アドレスを特定の IP アドレスにリンクすることにより、コンピューター側またはルーターで各コンピューターの IP アドレスをロックする必要があります。

于 2013-08-05T03:09:36.517 に答える