作者共发了4篇帖子。 内容转换:不转换▼
 
点击 回复
651 3
【程序】lwip-2.0.2通过DNS解析域名
一派护法 十九级
1楼 发表于:2017-4-2 21:36
原工程: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();
一派护法 十九级
2楼 发表于:2017-4-2 21:37
【程序运行结果】
DHCP分配成功!
IP地址: 192.168.1.116
子网掩码: 255.255.255.0
网关: 192.168.1.1
DNS服务器: 192.168.1.1
Not in cache! err=-5
DNS Found IP: 106.186.126.193
一派护法 十九级
3楼 发表于:2017-4-4 19:05
在main函数的主循环中还应该加上dns_tmr();的函数调用,调用的间隔时间为1s。
while (1)
{
    //......
    // 若定时器溢出
    if (TIM6->SR & TIM_SR_UIF)
    {
        //......
        if (cnt % 4 == 0)
        {
            // 250ms*4=1s
            etharp_tmr(); // ARP定时处理
            dns_tmr(); // ★DNS定时处理
        }
        //......
    }
}
一派护法 十九级
4楼 发表于:2017-4-5 19:51
其实,在main函数中根本不用加dns_init(),因为在lwip_init函数里已经自动调用了。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:651 回复数:3
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2017-4-5 19:51
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。