Mbed OS 文档翻译 之 参考(API(网络套接字(DNS 解析器)))

DNS 解析器

                               

                                                                                   DNS 类层次结构

DNS 解析器提供了用于执行 DNS 主机名解析的界面。您可以使用 DNS 主机名解析将资源名称转换为 IP 地址。连接接口后,可以进行 DNS 主机名解析。您可以使用返回的 IP 地址建立套接字连接。

用法

DNS 解析器支持阻止和异步 DNS 主机名解析。

要进行 DNS 主机名解析:

  1. 实例化并连接网络接口。
  2. 调用 gethostbyname() 函数来解析地址。

要进行异步 DNS 主机名解析:

  1. 为异步主机名解析创建回调函数。
  2. 实例化并连接网络接口。
  3. 使用回调函数调用 gethostbyname_async() 来解析地址。

要取消异步主机名解析:

  1. 存储 gethostbyname_async() 调用返回的唯一 ID。
  2. 使用唯一 ID 调用 gethostbyname_async_cancel() 以取消异步地址解析。

异步操作

DNS 解析器具有主机名和 IP 地址的缓存。如果从缓存中找到主机名,则 gethostbyname_async() 函数会立即返回成功。在函数返回之前调用回调。

如果地址不在缓存中,gethostbyname_async() 将返回操作的唯一 ID。在从网络上的 DNS 服务器到达响应或发生超时后调用回调。如果需要,您可以使用唯一 ID 取消 DNS 主机名解析。

如果 gethostbyname_async() 返回失败,则不会调用回调。

在设计回调函数时,请考虑以下注意事项:

从线程上下文调用回调。如果回调执行时间超过 10 毫秒,则可能会阻止底层线程处理。由于堆栈大小限制,不要调用网络操作; 回调不应执行昂贵的操作,例如套接字 recv / send 调用或阻塞操作。

DNS resolver 类参考

DNS 类参考

公共类型
typedef mbed::Callback< void(nsapi_error_t result, SocketAddress *address)>  hostbyname_cb_t
公共成员函数
virtual nsapi_error_t  gethostbyname (const char *host, SocketAddress *address, nsapi_version_t version=NSAPI_UNSPEC)=0
virtual nsapi_value_or_error_t  gethostbyname_async (const char *host, hostbyname_cb_t callback, nsapi_version_t version=NSAPI_UNSPEC)=0
virtual nsapi_error_t  gethostbyname_async_cancel (int id)=0
virtual nsapi_error_t  add_dns_server (const SocketAddress &address)=0

DNS 解析器示例

此 DNS 解析程序示例使异步 DNS 主机名解析。

main.cpp                                                                                                                                                 导入到 Mbed IDE

#include "mbed.h"
#include "nsapi_types.h"
#include "EthernetInterface.h"
#include "SocketAddress.h"
#include "Semaphore.h"

rtos::Semaphore callback_semaphore;
SocketAddress address;
nsapi_error_t result;

// Callback for asynchronous host name resolution
void hostbyname_callback(nsapi_error_t res, SocketAddress *addr)
{
    // Store result and release semaphore
    result = res;
    address = *addr;
    callback_semaphore.release();
}

int main()
{
    // Initialise network interface
    EthernetInterface eth;
    eth.connect();

    // Initiate asynchronous DNS host name resolution
    eth.gethostbyname_async("www.mbed.com", hostbyname_callback);

    // Wait for callback semaphore
    callback_semaphore.wait();

    // Print result
    printf("Result %s, Address %s\r\n", result == NSAPI_ERROR_OK ? "OK" : "FAIL",
        result == NSAPI_ERROR_OK ? address.get_ip_address() : "NONE");

    // Disconnect network interface
    eth.disconnect();
}

故障排除信息

网络接口 gethostbyname() 和 gethostbyname_async() 失败原因:

  • NSAPI_ERROR_DNS_FAILURE 表示 DNS 未能成功完成。检查主机名和网络连接。
  • NSAPI_ERROR_NO_MEMORY 表示堆上没有足够的内存来进行地址解析。

猜你喜欢

转载自blog.csdn.net/u012325601/article/details/82016454