DNS需要开启LWIP_DNS
这个宏,其中开启方式是在lwipopts.h
中找到LWIP_DNS然后#define LWIP_DNS 1
其中一共有两种方式进行DNS
,需要注意的是区别主要是一个是RAW API
,另外一个是 Sequential API
-
第一种方式进行连接的话有无操作系统都没有影响,只需要移植几个头文件,但是需要注意的是都是回调函数。
-
第二种方式进行编程则需要注意的是需要移植内核和上层函数的。但是只可以在操作系统上面进行编程。
-
还有第三种方式套接字进行编程,但是进行编程的话是需要注意的是,这是通过
Sequential API
再次进行封装的,所以速度会慢。但是使用起来可能和之前的Socket
类似 -
建议使用第一种和第二种混合使用。
OK,介绍完API接下来就是DNS需要注意的点了,一开始打算使用RAW API
进行编程,这个API使用的时候需要注意的是回调函数之前。但是由于需要定义各种结构体,比较麻烦最后决定采用Sequential API
/**
* @name:dns_server_local
* @brief:获取DNS地址
* @author: lzc
* @param {type} None
* @return {type} None
* @note: 修改记录:初次创建
*/
static ip_addr_t dns_server_local(char* url)
{
ip_addr_t openluat_url_dns_ipaddr; //IP结构体
err_t err;
printf("START DNS !!\r\n");
err = netconn_gethostbyname(( char* )url, &openluat_url_dns_ipaddr); //主要调用函数,需要注意进行解析时会进行阻塞,直到解析完成。
//当域名解析无法完成或者解析错误的时候会返回ERR_VAL错误
if (err == ERR_OK)
{
ip_ntoa(&openluat_url_dns_ipaddr);
printf(" IP IS = %s \n", ip_ntoa(&openluat_url_dns_ipaddr));
}
return openluat_url_dns_ipaddr;
}
踩坑处,需要注意的是调用函数的时候。不能在RAW API
的回调函数之中,不能在临界段中使用,传参最好不要用指针(可能是我指针没用对)。
需要包含的.h文件是#include "lwip/api.h"