Go Down

Topic: Domain-Adresse in eine IP-Adresse umwandeln (Read 3 times) previous topic - next topic

mkl0815


Der Include "Dns.h" ist keine Fremd-Bibliothek, die Datei ist Teil der Ethernet-Bibliothek. Sie wird normalerweise intern verwendet, es hält uns jedoch niemand davon ab, sie auch direkt zu verwenden. Wenn der OP die IP-Adresse des verwendeten Dienstes unbedingt wissen will, dann darf er das, auch wenn er den Namen im Sketch auch direkt verwenden kann.

Hmm, es ist aber ein Unterschied ob ich "#include <Dns.h>" oder #include "dns.h" schreibe. Letzteres sieht sehr nach einer zusätzlichen, lokal im Projekt liegenden Lib aus.

mkl0815

Hier zur Ergänzung noch ein Auszug aus der Definition der Ethernet-Klasse. Wie man sieht ist der DNS-Server IMMER der 3. Parameter.
Quote

  int begin(uint8_t *mac_address);
  void begin(uint8_t *mac_address, IPAddress local_ip);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway);
  void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);

COOL

#17
Nov 05, 2012, 05:30 pm Last Edit: Nov 05, 2012, 05:32 pm by COOL Reason: 1
Hallo Mario,

ich hatte anfangs nicht verstanden, warum du die Quelle meiner Lib haben wolltest. Ich habe keine zusätzliche Lib verwendet, es ist die unveränderte Ethernet-Lib, die bei der IDE 1.0.1 dabei ist.
Aufgrund deiner erneuten Nachfrage habe ich mal meinen Rechner nach einer "dns.h" absuchen lassen - nicht enthalten, nur die "Dns.h" unter Ethernet.
Also Schreibfehler - eigenartig ist nur, warum meine Schreibweise "#include "dns.h" nicht angemeckert wurde - ist also erledigt, Fehler bei mir.
Dein erster Code lässt sich kompilieren, das Ergebnis ist jedoch - TEST Ausgabe 0.0.0.0 -
Bei deinem letzten Code bekomme ich das Ergebnis - TEST Ausgabe 17.113.0.0 -  Genau das gleiche Ergebnis hatte ich auch schon mit meiner falschen Variante.

Da ich das nicht mehr verstehe, kann ich dazu leider keinen Kommentar abgeben. Es scheint doch ein wenig komplizierter zu sein.

Gruß Gerd



COOL

Habe mal im Netz nachgeschaut.

Die IP, die ausgeworfen ist, ist die IP von Apple in Kalifornien ???

pylon

Ich habe noch einen Fehler gefunden, ändere mal die folgende Zeile:

Code: [Select]
char host[] = "http://www.google.de";

in

Code: [Select]
char host[] = "www.google.de";

Ein DNS kann nur einen Hostnamen auflösen, die Interpretation einer URL ist aber dem aufrufenden Programm überlassen. "http://" spezifiziert das Protokoll (HTTP) und hat mit dem DNS nichts zu tun.

COOL

Hallo @pylon,
du wirst es nicht glauben, "http://www.google.de"; bringt das Ergebnis TEST Ausgabe 17.113.0.0 also die Apple IP
www.google.de bringt TEST Ausgabe 0.0.0.0

Ich habe das alles mal mit einem Windows-Rechner ausprobiert. Das Ergebnis ist gleich, auch hier wird die Apple-IP angezeigt ??

Gruß Gerd

MaFu

Also bei mir liefert auf dem (Windows) PC www.google.de die IP 173.194.35.159
_______
Manfred

pylon

Stimmen Deine Werte für den Gateway? Ist Dein Router wirklich auf der .150 zu finden?

Gib mal den Rückgabewert von getHostByName() aus, ich denke, dass Du immer einen Wert ungleich 0 zurückbekommst, somit einen Fehler. Dass manchmal etwas anderes zurückkommt, liegt wahrscheinlich daran, dass die 4 Bytes der Adresse nicht initialisiert wurden und somit irgend einen Wert haben können.

mkl0815

Schön, wenn Post auch gelesen werden. Ich zitiere mich mal selbst:



Weiterhin habe ich mal das char host[] = "www.google.de"; richtig gesetzt. Du willst einen Hostnamen auflösen, das ist NUR "www.google.de", das HTTP:// davor ist ein Protokoll das für eine bestimmte Art steht wie dann mit dem Server geredet werden soll, das hat nichts mit Hostnamen zutun.

mkl0815

Ich hab mir jetzt mal einen Arduino mit Ethernetshield geschnappt. Das Ergebnis ist repoduzierbar. Verwende ich einen lokalen DNS-Server (entweder die FritzBox selbst, oder meinen internen DNS-Server), dann klappt die Auflösung sofort. Wird ein externer DNS verwendet z.B. 8.8.8.8 oder 4.4.4.4 geht es nicht. Verwende ich allerdings einen anderen freien DNS-Server (z.B. 208.67.222.222) dann geht es.
Hier der Sketch der bei mir funktioniert:

Code: [Select]

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

byte mac[] = { 0xDE, 0xBB, 0xDE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 220 };
byte dnsserver[] = { 208,67,222,222 };
byte gateway[] = { 192, 168, 0, 252 };
byte sub[] = { 255, 255, 255, 0 };

int ret;

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip, dnsserver, gateway, sub);
  Serial.print("TEST ");

  const char* host = "www.google.de";
 
  DNSClient dns;
  IPAddress remote_addr;

  dns.begin(Ethernet.dnsServerIP());
  ret = dns.getHostByName(host, remote_addr);
  Serial.print("Ausgabe ");
  Serial.println(ret);
  Serial.print(remote_addr);
}

void loop() {
}

Anscheinend wird hier ein DNS-Request zusammengebaut, den google nicht mag.

COOL

EINFACH NUR S U P E R  !!!
DANKE !!!
Es hat geklappt, ich hätte dieses Wissen nie gehabt und wäre mit Sicherheit nie zum Ziel gekommen.
Damit ihr seht, habe ich den Screen mal reingelegt - ich hatte alles befolgt was man mir gesagt hat, jedoch dass das
so kompliziert ist, hätte ich nicht gedacht.
Ich frage mich nur, wie es angehen kann, dass bei @MaFu das geklappt haben soll.

Also nochmals herzlichen DANK

Gruß Gerd


mkl0815

Und um die Sache noch verrückter zu machen. Offensichtlich funktioniert es jetzt wohl auch wieder mit der 8.8.8.8, aber nicht mit der 4.4.4.4.
Irritierenderweise verwende ich für meinen internen DNS-Server die 8.8.8.8 als Forwarder, was gestern Abend (als eine direkte Abfrage nicht klappte) aber auch funktionierte. Irgendwas an den UDP Paketen die durch die DNS-Lib zusammengebaut werden hat google nicht gepasst.
Meine Vermuting war erst, das evtl. die UDP Checksumme nicht stimmt, aber das passt. Witzigerweise stimmt die Checksumme bei der Antwort meines DNS-Server nicht :-)
Hier mal ein tcpdump Mitschnitt, vielleicht sieht ja jemand mehr als ich:
Quote

lion:~ root# tcpdump -A  -i en0 -c 10 -e -nn -XX -vv port 53
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:59:01.348967 de:bb:de:ef:fe:ed > 10:9a:dd:4a:09:51, ethertype IPv4 (0x0800), length 72: (tos 0x0, ttl 128, id 1, offset 0, flags [DF], proto UDP (17), length 58)
    192.168.0.220.1036 > 192.168.0.4.53: [udp sum ok] 11265+ A? www.heise.de. (30)
   0x0000:  109a dd4a 0951 debb deef feed 0800 4500  ...J.Q........E.
   0x0010:  003a 0001 4000 8011 7881 c0a8 00dc c0a8  .:..@...x.......
   0x0020:  0004 040c 0035 0026 8ba2 2c01 0100 0001  .....5.&..,.....
   0x0030:  0000 0000 0000 0377 7777 0568 6569 7365  .......www.heise
   0x0040:  0264 6500 0001 0001                      .de.....
05:59:01.349288 10:9a:dd:4a:09:51 > de:bb:de:ef:fe:ed, ethertype IPv4 (0x0800), length 539: (tos 0x0, ttl 64, id 51396, offset 0, flags [none], proto UDP (17), length 525, bad cksum 0 (->2deb)!)
    192.168.0.4.53 > 192.168.0.220.1036: [bad udp cksum 7303!] 11265 q: A? www.heise.de. 1/13/12 www.heise.de. A 193.99.144.85 ns: . NS h.root-servers.net., . NS e.root-servers.net., . NS b.root-servers.net., . NS l.root-servers.net., . NS m.root-servers.net., . NS g.root-servers.net., . NS f.root-servers.net., . NS k.root-servers.net., . NS c.root-servers.net., . NS i.root-servers.net., . NS d.root-servers.net., . NS a.root-servers.net., . NS j.root-servers.net. ar: a.root-servers.net. A 198.41.0.4, a.root-servers.net. AAAA 2001:503:ba3e::2:30, b.root-servers.net. A 192.228.79.201, c.root-servers.net. A 192.33.4.12, d.root-servers.net. A 128.8.10.90, d.root-servers.net. AAAA 2001:500:2d::d, e.root-servers.net. A 192.203.230.10, f.root-servers.net. A 192.5.5.241, f.root-servers.net. AAAA 2001:500:2f::f, g.root-servers.net. A 192.112.36.4, h.root-servers.net. A 128.63.2.53, h.root-servers.net. AAAA 2001:500:1::803f:235 (497)
   0x0000:  debb deef feed 109a dd4a 0951 0800 4500  .........J.Q..E.
   0x0010:  020d c8c4 0000 4011 0000 c0a8 0004 c0a8  ......@.........
   0x0020:  00dc 0035 040c 01f9 843b 2c01 8180 0001  ...5.....;,.....
   0x0030:  0001 000d 000c 0377 7777 0568 6569 7365  .......www.heise
   0x0040:  0264 6500 0001 0001 c00c 0001 0001 0000  .de.............
   0x0050:  09da 0004 c163 9055 0000 0200 0100 001c  .....c.U........
   0x0060:  8a00 1401 680c 726f 6f74 2d73 6572 7665  ....h.root-serve
   0x0070:  7273 036e 6574 0000 0002 0001 0000 1c8a  rs.net..........
   0x0080:  0004 0165 c03b 0000 0200 0100 001c 8a00  ...e.;..........
   0x0090:  0401 62c0 3b00 0002 0001 0000 1c8a 0004  ..b.;...........
   0x00a0:  016c c03b 0000 0200 0100 001c 8a00 0401  .l.;............
   0x00b0:  6dc0 3b00 0002 0001 0000 1c8a 0004 0167  m.;............g
   0x00c0:  c03b 0000 0200 0100 001c 8a00 0401 66c0  .;............f.
   0x00d0:  3b00 0002 0001 0000 1c8a 0004 016b c03b  ;............k.;
   0x00e0:  0000 0200 0100 001c 8a00 0401 63c0 3b00  ............c.;.
   0x00f0:  0002 0001 0000 1c8a 0004 0169 c03b 0000  ...........i.;..
   0x0100:  0200 0100 001c 8a00 0401 64c0 3b00 0002  ..........d.;...
   0x0110:  0001 0000 1c8a 0004 0161 c03b 0000 0200  .........a.;....
   0x0120:  0100 001c 8a00 0401 6ac0 3bc0 ee00 0100  ........j.;.....
   0x0130:  0100 05ad 0100 04c6 2900 04c0 ee00 1c00  ........).......
   0x0140:  0100 05ad 0100 1020 0105 03ba 3e00 0000  ............>...
   0x0150:  0000 0000 0200 30c0 6700 0100 0100 05ad  ......0.g.......
   0x0160:  0100 04c0 e44f c9c0 c100 0100 0100 05ad  .....O..........
   0x0170:  0100 04c0 2104 0cc0 df00 0100 0100 05ad  ....!...........
   0x0180:  0100 0480 080a 5ac0 df00 1c00 0100 05ad  ......Z.........
   0x0190:  0100 1020 0105 0000 2d00 0000 0000 0000  ........-.......
   0x01a0:  0000 0dc0 5800 0100 0100 05ad 0100 04c0  ....X...........
   0x01b0:  cbe6 0ac0 a300 0100 0100 05ad 0100 04c0  ................
   0x01c0:  0505 f1c0 a300 1c00 0100 05ad 0100 1020  ................
   0x01d0:  0105 0000 2f00 0000 0000 0000 0000 0fc0  ..../...........
   0x01e0:  9400 0100 0100 05ad 0100 04c0 7024 04c0  ............p$..
   0x01f0:  3900 0100 0100 05ad 0100 0480 3f02 35c0  9...........?.5.
   0x0200:  3900 1c00 0100 05ad 0100 1020 0105 0000  9...............
   0x0210:  0100 0000 0000 0080 3f02 35              ........?.5


COOL

Hallo Mario,
ich habe einfach mal die DNS-Server- und Gateway-IP gleichgesetzt und es funktioniert auch.

Gruß Gerd

mkl0815

Das liegt daran, das die meisten Router als "DNS-Proxy" arbeiten. Hintergrund ist, das ein Router in der Regel vom Provider über den er die Internetverbindung aufbaut auch einen DNS-Server bekommt. Da Du den nicht kennen kannst, spielt der Router den Vermittler. Somit kann dann einfach die Router IP als DNS-IP verwendet werden
Ich hatte ja auch den Effekt, das eine Abfrage über die Fritzbox als DNS-Server und auch bei meinem eigenen DNS-Server die Anfrage funktionierte. Das Interessante allerdings war, das mein eigener DNS-Server selbst die 8.8.8.8 von goolge verwendet, um externe Anfragen aufzulösen. Eine direkte Verwendung der 8.8.8.8 auf dem Arduino ging zu diesem Zeitpunkt aber nicht.
Mario.

Go Up