DNS(Domain Name System,域名系统)是互联网的一项核心服务,作为将 域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的 IP 数串。例如,用户在浏览器中输入 www.wiznet.io,DNS 服务负责将其解析为对应的 IP 地址(如 183.111.138.249),使浏览器能够建立连接。
DNS 协议栈通过 wiz_add_timer(DNS_time_handler, 1000) 将 DNS_time_handler() 注册到软件定时器链表,每秒触发一次,用于更新 DNS 内部超时计数器。该函数与 DNS_run() 配合使用,当 DNS 查询超时后会自动重试。DHCP 同理,通过 wiz_add_timer(DHCP_time_handler, 1000) 注册。
步骤2:DNS 解析函数 do_dns()
文件:USER/do_dns/do_dns.c — 传入以太网缓冲区、待解析域名、结果 IP 缓冲区,先调用 DNS_init() 初始化 DNS 客户端,再用 wizchip_getnetinfo() 获取网络信息(含 DNS 服务器地址),最后循环调用 DNS_run() 发起查询,直到成功或超过重试次数。
注意:do_dns()只调用一次,内部已经通过 while 循环完成查询和重试,解析成功或失败后返回。返回后主程序进入空循环。待解析域名和结果 IP 缓冲区定义在 user_main.c 中。
运行验证
打开 WIZ UartTool V1.0,连接 DEBUG USB 对应 COM 口(115200 / 8N1)。烧录例程运行后,首先进行 PHY 链路检测,然后通过 DHCP 获取网络参数(含 DNS 服务器地址),最后发起 DNS 查询将 www.wiznet.io 解析为 IP 地址。预期串口输出如下:
MH2457 W6300 QSPI example start
W6300 DNS example
PHY link
The current Mbtis speed : 100Mbps
The current Duplex Mode : Full-Duplex
DHCP running
DHCP success!
====================================================================================================
W6300 network configuration : DHCP
MAC : 00:08:DC:12:34:56
IP : 192.168.1.8
Subnet Mask : 255.255.255.0
Gateway : 192.168.1.1
DNS : 192.168.1.1
====================================================================================================
> Translated www.wiznet.io to 183.111.138.249
解析成功后,串口会打印 > Translated www.wiznet.io to 183.111.138.249,表示已成功将域名解析为对应的 IP 地址。可使用 Wireshark 抓包工具在 PC 上捕获 UDP 53 端口的 DNS 报文,对照上文报文结构进行验证。
WIZ UartTool 串口输出 — PHY 链路检测 + DHCP 获取网络参数 + DNS 解析 www.wiznet.io 成功Wireshark 抓包 — DNS 查询(Standard query A www.wiznet.io)与响应报文(Standard query response A 183.111.138.249)
本例程使用 DHCP 自动获取的 DNS 服务器地址(通过 wizchip_getnetinfo() 读取)。如需手动指定,可在 wiz_NetInfo 中把 dhcp 改为 NETINFO_STATIC 并填入静态 DNS。常用公共 DNS 服务器有 114.114.114.114(国内)、8.8.8.8(Google)、223.5.5.5(阿里)。本例程在 do_dns 中还提供了回退机制:若 DHCP 获取的 DNS 为空,则使用 APP_DNS_SERVER(8.8.8.8)。
Q: DNS 解析失败如何排查
首先确认网络连通性(能否 ping 通网关和 DNS 服务器);检查 DHCP 是否成功获取到 DNS 服务器地址(串口网络配置表格中的 DNS 字段);确认软件定时器已正确注册(wiz_add_timer(DNS_time_handler, 1000) 被调用);使用 Wireshark 抓包查看 DNS 查询报文是否发出及服务器是否响应;某些域名可能不存在 A 记录,可尝试更换其他域名测试。
总结
本文讲解了如何在 W6300 芯片上使用 DNS 协议将域名解析为 IP 地址,通过实战例程展示了完整的解析流程: