1.前言

lwIP提供一个基本的DNS客户端(1.3.0后引进),通过使用DNS(Domain Name System)协议来允许应用程序解决主机名到地址的转换。

在文件lwipopts.h里面定义LWIP_DNS的值为非零值可以使能DNS。

如果DHCP与lwIP DNS客户端一起工作,那么DNS将会自动被配置使用提供的DNS服务器(如果DHCP提供一个)。

2.Application DNS requests with Raw/Native API

Raw API应用可以使用dns_gethostbyname()函数来请求一次查找,并指定一个回调函数当查找结束时来通知应用程序。

你可以通过如下来阅读函数头部,该函数会马上返回。如果请求的地址已经知道,那么该函数会马上通过指针参数返回。

当一个DNS服务器的请求结束时,你的回调函数将会被调用

* err_t
* dns_gethostbyname(const char *hostname, struct ip_addr *addr, dns_found_callback found,
* void *callback_arg)
*
* Resolve a hostname (string) into an IP address.
* NON-BLOCKING callback version for use with raw API!!!
*
* Returns immediately with one of err_t return codes:
* - ERR_OK if hostname is a valid IP address string or the host
* name is already in the local names table.
* - ERR_INPROGRESS enqueue a request to be sent to the DNS server
* for resolution if no errors are present.
*
* @param hostname the hostname that is to be queried
* @param addr pointer to a struct ip_addr where to store the address if it is already
* cached in the dns_table (only valid if ERR_OK is returned!)
* @param found a callback function to be called on success, failure or timeout (only if
* ERR_INPROGRESS is returned!)
* @param callback_arg argument to pass to the callback function
* callback function and argument defined as follows:
* A function of this type must be implemented by the application using the DNS resolver.
* @param name pointer to the name that was looked up.
* @param ipaddr pointer to a struct ip_addr containing the IP address of the hostname,
* or NULL if the name could not be found (or on any other error).
* @param callback_arg a user-specified callback argument passed to dns_gethostbyname:
*
* typedef void (*dns_found_callback)(const char *name, struct ip_addr *ipaddr, void *callback_arg);

A sample call:

struct ip_addr resolved;

  switch(dns_gethostbyname("www.lwIP.com", &resolved, smtp_serverFound, NULL)){
case ERR_OK:
// numeric or cached, returned in resolved
smtp.serverIP.addr = resolved->addr;
smtp.state = SMTP_NAME_RESOLVED;
break;
case ERR_INPROGRESS:
// need to ask, will return data via callback
smtp.state = SMTP_NAME_RESOLVING;
break;
default:
// bad arguments in function call
break;
}

A sample DNS callback function:

void smtp_serverFound(const char *name, struct ip_addr *ipaddr, void *arg)
{
if ((ipaddr) && (ipaddr->addr))
{
smtp.serverIP.addr = ipaddr->addr;
smtp.state = SMTP_NAME_RESOLVED;
if (smtp_connect() == ERR_OK)
return;
smtp.lastError = SMTP_CONNECT_FAILED;
}
else
smtp.lastError = SMTP_UNKNOWN_HOST;
smtp.state = SMTP_IDLE;
}

3.Application DNS requests with Netconn API

err_t netconn_gethostbyname(const char *name, ip_addr_t *addr)

See also netconn_gethostbyname().

4.Application DNS requests with Sockets API

For socket based apps, a gethostbyname() wrapper function is provided that blocks during the lookup if necessary. Use the following functions:

  • gethostbyname() - standard implementation, blocks if necessary until lookup complete or fails
  • gethostbyname_r() - thread-safe version of gethostbyname (separate buffer for each invokation)

5.External References

DNS-related RFCs

6.Revisions

  • Local static host lookup table support (added in 1.3.1)
  • Return multiple IP addresses (future)
  • Return other RR (record) types e.g. MX, SRV... (future)
  • implement a "Dynamic DNS update" message (future)

LwIP Application Developers Manual5---高层协议之DNS的更多相关文章

  1. LwIP Application Developers Manual5---高层协议之DHCP,AUTOIP,SNMP,PPP

    1.前言 本文主要讲述高层协议,包括DHCP 2.DHCP 2.1 从应用的角度看DHCP 你必须确保在编译和链接时使能DHCP,可通过在文件lwipopts.h里面定义LWIP_DHCP选项,该选项 ...

  2. LwIP Application Developers Manual2---Protocols概览

    1.前言 本文是对LwIP Application Developers Manual的翻译 lwIP是模块化的并支持广泛的协议,这些大部分协议可以被裁减从而减小代码的尺寸 2.协议概览 链路层和网络 ...

  3. LwIP Application Developers Manual1---介绍

    1.前言 本文主要是对LwIP Application Developers Manual的翻译 2.读者(应用开发手册的读者) 谁适合读这份手册 网络应用的开发者 想了解lwIP的网络应用开发者 阅 ...

  4. LwIP Application Developers Manual3---链路层和网络层协议之ARP,IPV4

    1.前言 本文主要讲述链路层和网络层的几种协议:ARP,ipv4 2. ARP 2.1 ARP的主要应用 ARP的主要应用是在与互联网相连的以太网网络层,该层需要一些机制将MAC地址(该地址主要由制造 ...

  5. LwIP Application Developers Manual6---Application API layers

    1.前言 lwIP提供3种应用编程接口来跟TCP/IP内核通信,如下所示: 低水平的内核/回调或raw API 2个高水平序列API: 1) netconn API 2) socket API(为了兼 ...

  6. LwIP Application Developers Manual3---链路层和网络层协议之IPV6,ICMP,IGMP

    1.前言 本文主要讲述链路层和网络层的协议IPV6,ICMP 2.IPV6 2.1 IPV6特性 IPv6是IPv4的更新.其最显著的差别在于地址空间由32位转换成128位 2.2 从应用的角度看IP ...

  7. LwIP Application Developers Manual9---LwIP and multithreading

    1.前言 lwIP的内核并不是线程安全的.如果我们必须在多线程环境里使用lwIP,那么我们必须使用“upper”API层的函数(netconn或sockets).当使用raw API时,你需要自己保护 ...

  8. LwIP Application Developers Manual7---lwIP with or without an operating system

    1.前言 最近有一些讨论关于lwIP如何在单机的环境(比如,没有一个多线程的操作系统)使用. 本文的目的就是描述lwIP如何在无多线程操作系统或有多线程操作系统环境中运行 2.lwIP单线程内核 2. ...

  9. LwIP Application Developers Manual4---传输层之UDP、TCP

    1.前言 本文主要讲解传输层协议UDP TCP 2.UDP 2.1 UDP from an application perspective 2.2 UDP support history in lwI ...

随机推荐

  1. Java集合、Iterator迭代器和增强for循环整理

    集合 集合,集合是java中提供的一种容器,可以用来存储多个数据. 数组的长度是固定的.集合的长度是可变的.集合中存储的元素必须是引用类型数据 1.1      ArrayList集合存储元素 pac ...

  2. Storm 消息分发策略

    1.Shuffle Grouping:随机分组,随机派发stream里面的tuple,保证每个bolt接收到的tuple数目相同.2.Fields Grouping:按字段分组,比如按userid来分 ...

  3. Canvas判断内容为空

    如题,项目需要做一个canvas的绘图工具,绘制图纸传递给后台.因此需要做一个非空验证,记录解决方法祝大家早日脱坑. js验证代码: //验证canvas画布是否为空函数function isCanv ...

  4. JQ和Js获取span标签的内容

    JQ和Js获取span标签的内容 html: 1 <span id="content">‘我是span标签的内容’</span> javascript获取: ...

  5. 简:Spring中Bean的生命周期及代码示例

    (重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...

  6. Socket远程调试日志之 SocketLog的简单实用

    github地址:https://github.com/luofei614/SocketLog 更多信息看这里:https://www.bbsmax.com/A/8Bz8L9Nyzx/ tp5配置co ...

  7. 外部程序调用Django模块的解决办法

    Question django.core.exceptions.ImproperlyConfigured: Requested setting CACHES, but settings are not ...

  8. Retrofit GreenDao开发中遇到的坑

    持续更新中1.使用@FormUrlEncoded的话,服务端需要使用Request.Form,如果不使用@FormUrlEncoded本地需要由 @FieldMap Map<String, Ob ...

  9. Nginx负载均衡session会话保持方法

    负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法: 1.使用cookie 将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在 ...

  10. Xampp PHPStorm XDebug配置

    (1)https://xdebug.org/download.php 下载当前Xampp对应的XDebug版本. (2)将该dll放入C:\xampp\php\ext (3)修改Control Pan ...