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. zookeeper kafka集群

    一.部署zookeeper集群 三台机器上执行相同的操作 mkdir -p /data/zookeeper cd zookeeper-3.4.6 cp zoo_sample.cfg zoo.cfg [ ...

  2. 面向对象【day08】:异常处理-断言(七)

    本节内容 1.概述 2.知识点回顾 3.断言 一.概述 python中断言,这个我是第一次听说到的,断言有什么用呢?断言就是做一些程序的检查工作,就是在执行之前需要做的一些检查,比如类似于安检一样,合 ...

  3. Java Web之Http协议

    为什么会出现HTTP协议?有什么用? 浏览器和服务器之间进行数据的沟通的时候,需要标准,浏览器有Chrome浏览器,火狐浏览器,IE浏览器等.服务器有Tomcat服务器,IIS服务器等,由于各自标准不 ...

  4. java io系列18之 CharArrayReader(字符数组输入流)

    从本章开始,我们开始对java io中的“字符流”进行学习.首先,要学习的是CharArrayReader.学习时,我们先对CharArrayReader有个大致了解,然后深入了解一下它的源码,最后通 ...

  5. JDBC-Transaction

    /** * 数据库中事务,指一组逻辑操作单元,使数据从一种状态变换到另一种状态 * 操作全部完成时,数据被保留,一致性可以保持,一部分操作失败时,整个操作全部视为错误,所有被操作数据回退到开始状态,放 ...

  6. java8的Streams

    首先看一个问题:在这个task集合中一共有多少个OPEN状态的?计算出它们的points属性和.在Java 8之前,要解决这个问题,则需要使用foreach循环遍历task集合:但是在Java 8中可 ...

  7. shiro默认登录

    业务需要,A项目跳转到B项目进行相关操作.而B项目使用的是shiro登录验证,懵逼了半天,好吧我很菜. 当然你也可以在shiro配置文件中放过这些方法,但是为了安全考虑需要遵守这些规则. 因此A跳转到 ...

  8. jsp页面的共用

    我们经常希望一个网页,根据不同得请求显示不同得数据. 方法就是在session中添加一个变量,根据不同得值区分不同得请求类型. 后台:request.getSession().setAttribute ...

  9. 使用 highlight.js 在网页中高亮显示java 代码 【原】

    <html> <head> <meta charset="UTF-8"> <script src="http://apps.bd ...

  10. SpringMVC的概念和图解

    1.概念 Spring MVC起步:慕课网视频 SpringMVC架构浅析:参考 Spring详解(一)------概述 Spring架构简单描述 2.图片