原工程:https://zh.arslanbar.net/post.php?t=24584
首先,打開配置文件lwipopts.h,添加如下三行,開啟DNS:
#define LWIP_DNS 1
#define LWIP_DHCP_PROVIDE_DNS_SERVERS 1 // 通過DHCP獲取DNS伺服器的地址
#define LWIP_RAND() ((u32_t)rand())
然後打開main.c,添加頭文件:
#include "lwip/dns.h"
編寫dns測試函數:
void dnsfound(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
{
printf("DNS Found IP: %s\n", ip4addr_ntoa(ipaddr));
}
void test_dns(struct netif *netif)
{
struct ip4_addr dnsip;
err_t err = dns_gethostbyname("zh.arslanbar.net", &dnsip, dnsfound, NULL);
if (err == ERR_OK)
printf("In cache! IP: %s\n", ip4addr_ntoa(&dnsip));
else
printf("Not in cache! err=%d\n", err);
}
在show_addr函數中調用test_dns函數:
void show_addr(struct netif *netif)
{
struct dhcp *dhcp = netif_dhcp_data(netif);
static uint8_t displayed = 0;
if (dhcp->state == DHCP_STATE_BOUND)
{
if (displayed == 0)
{
printf("DHCP分配成功!\n");
printf("IP位址: %s\n", ip4addr_ntoa(&dhcp->offered_ip_addr));
printf("子網掩碼: %s\n", ip4addr_ntoa(&dhcp->offered_sn_mask));
printf("網關: %s\n", ip4addr_ntoa(&dhcp->offered_gw_addr));
printf("DNS伺服器: %s\n", ip4addr_ntoa(dns_getserver(0))); // ★
displayed = 1;
test_dns(netif); // ★
}
}
else
displayed = 0;
}
最後,在main函數中的dhcp_start函數調用前加上:dns_init();