我正在尝试使用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() {
}
这是它的输出(第二个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
发生了什么事?
答案 0 :(得分:2)
我不知道你是否已找到解决方案,但以防万一:
inet_aton
中有一个缺陷,它是DNS库的一部分:
这应该将字符串IP地址转换为IPAddress类型。
要找出它测试字符串中每个字符的数字:
while (*p &&
( (*p == '.') || (*p >= '0') || (*p <= '9') ))
但任何字母字符都匹配*p >= '0'
应该是:
while (*p &&
( (*p == '.') || ((*p >= '0') && (*p <= '9')) ))
您需要在Dns.cpp
中更改此内容。
答案 1 :(得分:0)
许多路由器将提供其LAN端IP地址作为DNS地址 - 这是DHCP设置的典型行为。这并不一定意味着它们实际上是服务器。有些人只是简单地将DNS请求转发给WAN端服务器并返回响应。路由器只是代理的这种配置解释了您的症状。
当路由器是代理时,Arduino DNS请求只是被转发到不知道你的本地名称的外部DNS服务器。
Linux机器正在使用其他网络协议来发现本地名称。在已知本地计算机名称的Windows机器上也会发生同样的情况。如果您运行像Wireshark这样的网络监视器,您将看到计算机定期向其他计算机宣布它们的存在。 Arduino只有简单的TCP / IP,不处理这些广播。
如果路由器确实是服务器,那么您必须配置一个表,其中包含名称到IP地址映射的条目。要使其工作,您不能使用动态地址,因为有一天您在表中键入的内容将无效。要使本地DNS服务器与DHCP一起工作,您可能希望通过将特定MAC地址链接到特定IP地址来锁定计算机端或路由器上的每个计算机IP地址。