shield mac ipaddress ejemplo begin networking dns arduino

networking - mac - Problemas locales de DNS de Arduino



ethernet server arduino (2)

Muchos enrutadores proporcionarán su dirección IP del lado LAN como la dirección DNS; ese es el comportamiento típico de las configuraciones de DHCP. Eso no significa necesariamente que sean en realidad el servidor . Algunos simplemente reenvían las solicitudes DNS a los servidores de la WAN y devuelven la respuesta. Este tipo de configuración donde el enrutador es solo un proxy explica sus síntomas.

Cuando el enrutador es un proxy, las solicitudes DNS de Arduino se están reenviando al servidor DNS externo que no conoce sus nombres locales.

La máquina Linux está utilizando otros protocolos de red para descubrir nombres locales. Lo mismo ocurre con las máquinas Windows donde se conocen los nombres de las computadoras locales. Si ejecuta un monitor de red como Wireshark, verá que las computadoras anuncian regularmente su presencia a otras computadoras. Arduino solo tiene TCP / IP simple y no procesa estas transmisiones.

Si el enrutador es realmente un servidor, entonces debe configurar una tabla con las entradas de nombre a la asignación de direcciones IP. Para que esto funcione, no puede usar direcciones dinámicas porque lo que escriba en la tabla un día no sería válido. Para hacer que un servidor DNS local funcione con DHCP, debería bloquear las direcciones IP de cada computadora, ya sea en el lado de la computadora o en el enrutador, vinculando direcciones MAC específicas a direcciones IP específicas.

Estoy intentando crear un pequeño proyecto usando la biblioteca Arduino Ethernet, pero estoy teniendo un problema de DNS extraño: no puede resolver ningún nombre de dominio que sea local en mi red, pero no tiene problemas para resolver nombres de dominio público . Ningún otro sistema en mi red tiene problemas con estos nombres de dominio locales, simplemente parece ser el Arduino.

Esto es lo que estoy usando:

Aquí está mi boceto de prueba:

#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() { }

Aquí está su salida (la segunda IP es incorrecta):

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

Aquí está la información correcta dada desde una máquina Linux conectada a la misma red:

$ 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

¿Alguien tiene idea de lo que está pasando?


No sé si ya has encontrado una solución, pero por las dudas:

Hay un defecto en inet_aton que es parte de la biblioteca DNS:
Se supone que esto convierte una cadena de dirección IP a IPAddress type.

Para averiguarlo, prueba cada carácter en la cadena de numerales:

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

pero cualquier carácter alfabético coincide con *p >= ''0''

Debería ser:

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

Necesita cambiar esto en Dns.cpp