1. 程式人生 > >LWIP之DNS、

LWIP之DNS、

  1. 先把巨集定義新增上去

#ifndef LWIP_DNS
#define LWIP_DNS 1
#endif

  1. 在系統初始化呼叫
    dns_init();
    1、建立一個udp的專用於dns的dns_pcb控制塊
    2、dns_setserver指定dns的伺服器地址寫進dns_servers陣列

  2. 在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”))) /

resolver1.opendns.com */
#endif

一般程式會將8.8.8.8設定為dns的伺服器地址,這是Google提供的免費DNS伺服器的IP地址

  1. 如果沒有使用作業系統,需要自己新增定時處理函式,例如在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伺服器地址,而不用手動設定