LWIP之DNS、
- 先把巨集定義新增上去
#ifndef LWIP_DNS
#define LWIP_DNS 1
#endif
-
在系統初始化呼叫
dns_init();
1、建立一個udp的專用於dns的dns_pcb控制塊
2、dns_setserver指定dns的伺服器地址寫進dns_servers陣列 -
在while(1)之前或者在你認為需要呼叫的地方呼叫dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *found)
其中,hostname為你需要解析的域名,addr為解析返回的IP地址指標,found回撥函式。
=>dns_enqueue將需要dns的域名填充存放在dns_table
這個table的大小就是同時可以dns的域名數量的多少了!
=>dns_check_entry檢查dns_table的狀態機
=>根據狀態機呼叫dns_send向dns_servers傳送資料
=>dns_tmr有個dns定時器不斷的dns請求
=>dns_check_entries=>dns_check_entry
最後在dns_recv裡收到域名對應的IP
4.特別注意:配置正確的DNS伺服器地址。(儘量通過DHCP獲取DNS伺服器地址,不要手動填寫)
/** DNS server IP address /
#ifndef DNS_SERVER_ADDRESS
#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, ipaddr_addr(“208.67.222.222”))) /
#endif
一般程式會將8.8.8.8設定為dns的伺服器地址,這是Google提供的免費DNS伺服器的IP地址
- 如果沒有使用作業系統,需要自己新增定時處理函式,例如在LwIP_Periodic_Handle函式中新增:
#if LWIP_DNS
if (localtime - DNScoarseTimer >= DNS_TMR_INTERVAL)
{
DNScoarseTimer = localtime;
dns_tmr();
}
#endif
dhcp_start是DHCP的流程操作的啟動開始,與DNS一樣都是udp方式的
dhcp_bind提供獲得的IP地址,從dhcp_recv函式呼叫過來的
1.DHCPDISCOVER
2.DHCPOFFER
3.DHCPREQUEST
4.DHCPACK
可以通過dhcp_handle_ack來獲取dns伺服器地址,而不用手動設定