域名解析
在项目应用中,运用到了域名解析的功能,第一次接触,在这里记录下来:
1.先把LWIP_DNS宏定义开启
在lwipopts.h中使能DNS功能,如下所示:
#define LWIP_DNS 1
2.在系统初始化时调用
dns_init();
sys_timeouts_init();
以上初始化在lwip协议栈1.4.1版本中lwip_init();函数中已初始化完成,只需调用lwip_init();即可;
3.在你认为需要调用的地方调用
dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *found);
其中,hostname为你需要解析的域名,addr为解析返回的IP地址指针,found回调函数。
4.特别注意:配置正确的DNS服务器地址。
(尽量通过DHCP获取DNS服务器地址,不要手动填写,参考:https://blog.csdn.net/chen244798611/article/details/78576806)
/** DNS server IP address */
#ifndef DNS_SERVER_ADDRESS
#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, ipaddr_addr("192.168.11.1"))) /* resolver1.opendns.com */ //208.67.222.222
#endif
5.如果没有使用操作系统,需要自己添加定时处理函数
#if LWIP_DNS
static void lwipDNSTickTaskCreate()
{
TASK Task;
Task.wType = TASK_WHILELOOP;
Task.period.tCounter = 0;
Task.period.tTimer = DNS_TMR_INTERVAL;
Task.pRun = LwipDNSTickRun;
Task.pParam = 0;
Create_Task(&Task, 0);
}
static void LwipDNSTickRun(void *pParam)
{
dns_tmr(); //1s进入一次
}
#endif
以上为lwip域名解析操作流程,下面贴上应用代码(利用485发送域名信息,解析成功后返回):
void dns_found(const char *name, ip_addr_t *host_ip, void *callback_arg)
{
;
}
static void RunRS485(void *vpParam)
{
WORD wLen = 0;
struct ip_addr dnsaddr;
char Testname[] = "ongoing...";
wLen = Device_Read(g_hRS485, (BYTE_T *)g_sRs485Recvbuf, 0, 0);
if(wLen > 0)
{
if(strstr((char *)g_sRs485Recvbuf, "www") != NULL)
{
if(dns_gethostbyname((char *)g_sRs485Recvbuf, &(dnsaddr), dns_found, NULL) == ERR_OK)
{
char *ptr = ip_ntoa(&dnsaddr);
Device_Write(g_hRS485, (BYTE_T *)ptr, sizeof(char)*14, 0); //打印地址信息
}
else
{
Device_Write(g_hRS485, (BYTE_T *)Testname, strlen(Testname), 0);
}
}
}
Device_Control(g_hRS485, RS485_CMD_RX, NULL);
Device_Control(g_hRS485, RS485_CMD_TX, NULL);
}
测试结果: