当前位置: 首页 > news >正文

W6100-EVB-PICO做DNS Client进行域名解析(四)

前言

在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解析,通过请求DNS服务器可以对一网络域名进行解析后获得其ip地址。

什么是DNS,有何用途?

        DNS: 连接域名与IP地址的桥梁
        在互联网的浩瀚海洋中,我们每天都在使用各种域名来访问不同的网站。例如,当我们想要观看某个视频网站时,我们只需要在浏览器中输入该网站的域名,就可以轻松地访问到该网站。那么,我们是如何通过域名来找到网站的呢?这就离不开DNS的作用
        DNS,全称Domain Name System,中文名为域名系统。它是互联网的一项重要服务,主要负责将人们所款悉的域名转换为电脑可以理解的IP地址。在互联网中,所有的信息都需要通过IP地址来进行识别和访问,而DNS就是连接域名和IP地址之间的桥梁
当我们输入一个域名时,DNS会根据这个域名返回相应的IP地址,然后我们的电脑就可以通过这个IP地址来访问对应的网站。这个过程在无形中进行,我们只需要在浏览器中输入域名即可。
DNS不仅仅是将域名转换为IP地址这么简单,它还承担着其他重要的责任。例如,当一个网站的域名被恶意攻击时,DNS可以提供一定的防护作用。另外,DNS还可以帮助我们加速网页的加载速度,提高互联网的访问效率
        总之,DNS是互联网的重要组成部分,它为我们提供了更方便、更快捷的访问方式。正是因为有了DNS,我们才能够轻松地通过域名来访问网站,了解世界各地的信息。在未来,随着互联网的发展,DNS的作用将更加重要,它将为人们提供更加优质、更加便捷的互联网服务

软硬件准备:

软件:VS code(须具有相应开发环境,具体参考第一章)

硬件;W6100-EVB-PICO开发板,网线,micro USB 数据线,路由器(可上网)

通过使用DNS协议解析百度域名

1.相关代码:

我们先找到dns.h头文件下面看下,可以看到几个函数声明,我们需要用到如下所示几个函数:

DNS_init,要我们传入dns信息的接收缓存buff地址;DNS_run根据这个函数描述,需要我们传入一个socket端口号,dns服务器ip,请求解析的域名,解析后ip存放的地址,以及模式(IPv4或IPv6);DNS_time_handler是1s定时器的处理程序,我们要把它放在一个定时器里,每到1秒调用1次,做dns解析时的计时操作,以判断是否超时,并做相应处理。

/** @brief DNS process initialize* @param s   : Socket number for DNS* @param buf : Buffer for DNS message*/
void DNS_init(uint8_t * buf);/** @brief DNS process* @details Send DNS query and receive DNS response* @param dns_ip        : DNS server ip* @param name          : Domain name to be queryed* @param ip_from_dns   : IP address from DNS server* @return  -1 : failed. @ref MAX_DOMIN_NAME is too small \n*           0 : failed  (Timeout or Parse error)\n*           1 : success* @note This funtion blocks until success or fail. max time = @ref MAX_DNS_RETRY * @ref DNS_WAIT_TIME*/
int8_t DNS_run(uint8_t s,uint8_t * dns_ip, uint8_t * name, uint8_t * ip_from_dns,uint8_t mode);/** @brief DNS 1s Tick Timer handler* @note SHOULD BE register to your system 1s Tick timer handler*/
void DNS_time_handler(void);

然后我们打开dns_client.c,可以看到先初始化网络信息和所需要的解析域名,这里以百度(www.baidu.com)为例,然后与上一章的dhcp类似,都是将函数封装好,然后声明后直接在主程序里调用。如下所示。

#define ETHERNET_BUF_MAX_SIZE (1024 * 2)void network_init(void);
int dns_test(void);
bool repeating_timer_callback(struct repeating_timer *t);wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},.ip = {192, 168, 1, 10},.sn = {255, 255, 255, 0},.gw = {192, 168, 1, 1},.dns = {8, 8, 8, 8},.dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
uint8_t DNS_2nd[4] = {114,114,114,114};
uint8_t Domain_name[] = "www.baidu.com";
uint8_t Domain_IP[4] = {0,};
uint8_t g_msec_cnt = 0;

我们简单看下声明的这三个函数的具体实现,如下所示:network_init是配置网络信息并用串口打印回显方便观察;dns_test通过调用DNS_run根据其返回的状态做出相应处理,如果dns服务器解析超时或失败就用备用的,如果解析成功就打印出域名解析后的对应ip;然后把定时器处理程序放在定时器回调里,定时1秒,每秒调用一次。

void network_init(void)
{uint8_t temp;wizchip_initialize();printf("W6100 dns test example.\r\n");sleep_ms(2000);/* Determine the network lock register status */if(!ctlwizchip(SYS_NET_LOCK, &temp)){   printf("unlock.\n");NETUNLOCK();}wizchip_setnetinfo(&static_info);print_net_info(&net_info);sleep_ms(2000);
}int dns_test(void)
{int ret;printf("\r\n===== DNS Client Example =====\r\n");printf("> DNS 1st: %d.%d.%d.%d\r\n",net_info.dns[0],net_info.dns[1],net_info.dns[2],net_info.dns[3]);printf("> DNS 2nd: %d.%d.%d.%d\r\n",DNS_2nd[0],DNS_2nd[1],DNS_2nd[2],DNS_2nd[3]);printf("==============================\r\n");printf("> Example Domain Name : %s\r\n",Domain_name);if((ret = DNS_run(SOCKET_ID, net_info.dns, Domain_name, Domain_IP, AS_IPV4)) > 0){printf("> 1st DNS Reponsed\r\n");}else if((ret != -1) && ((ret = DNS_run(SOCKET_ID, DNS_2nd, Domain_name, Domain_IP, AS_IPV4)) > 0)){printf("> 2nd DNS Responsed\r\n");}else if(ret == -1){printf("> MAX_DOMAIN_NAME is too small. Should be redefined it. \r\n");}else{printf("> DNS Failed\r\n");}if(ret > 0){printf("> Translated %s to %d.%d.%d.%d\r\n",Domain_name,Domain_IP[0],Domain_IP[1],Domain_IP[2],Domain_IP[3]);return 1;}return 0;
}/* Timer */
bool repeating_timer_callback(struct repeating_timer *t)
{DNS_time_handler();return true;
}

 主程序就是先初始化所有配置,启动定时器,然后运行dns即可,成功就停止(进入while死循环),不成功就继续执行。

2.编译烧录

编译后,打开build下对应的文件夹里找到uf2文件;然后开发板按下BOOTSEL键复位上电进入程序下载模式,此时我们的电脑会检测到一个名为RPI-RP2的u盘,把uf2文件拖入即可完成烧录,如下所示:

 3.测试现象

程序下载到我们的开发板后,打开串口监视器,波特率默认为115200,我们可以看到通过dns我们成功解析出了百度(www.baidu.com)的IP地址。如下图所示:

 相关代码链接 

W6100-EVB-PICO相关例程https://gitee.com/wiznet-hk/example-of-w6100-evb-pico.git

相关文章:

W6100-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解…...

{Fixed} Android TV国内开机不会自动连接WIFI / 连接国内网络不会更新时间

引用: 悟空百科 使用usb adb、网络adb、串口敲以下命令修改安卓全局数据库 1、写入新的ntp服务器地址 adb shell settings put global ntp_server ntp.ntsc.ac.cn2、打开网络验 //如果你是Android R 以上的电视盒子 adb shell settings put global captive_portal_mode 1/…...

【ASP.NET MVC】数据到客户端(7)

前文ViewBag数据在服务端动态生成页面,也可以传到客户端浏览器供JS使用。 一、数据从控制器到客户端 前文介绍,动态生成页面时,控制器的数据 并没有传递到 客户端,而是给自己来用,生成View 再利用http传递到客户端浏…...

InnoDB有哪些特性

事务支持:InnoDB支持ACID(原子性、一致性、隔离性和持久性)事务,可以保证数据的完整性和一致性。它使用多版本并发控制(MVCC)来实现事务的隔离性,支持读已提交和可重复读两种隔离级别。 行级锁…...

【linux--->数据链路层协议】

文章目录 [TOC](文章目录) 一、数据链路层协议概念二、以太网帧格式1.字段分析 三、局域网通信原理四、ARP协议1.结构2.作用3.ARP通信过程4.ARP协议相关命令 五、局域网内中间人原理六、DNS系统(域名系统)1.域名概念2.DNS系统组成3.DNS协议3.浏览器输入域名后的通信过程4.dig工…...

如何在pytest接口自动化框架中扩展JSON数据解析功能?

开篇 上期内容简单说到了。params类类型参数的解析方法。相较于简单。本期内容就json格式的数据解析,来进行阐述。 在MeterSphere中,有两种方式可以进行json格式的数据维护。一种是使用他们自带的JsonSchema来填写key-value表单。另一种就是手写json。…...

哪些年,我们编程四处找的环境依赖

基于Maven&#xff0c;快速构建SSM项目 <properties><!-- 将spring和有关的升级版本&#xff0c;设置为5.0.5--><spring.version>5.0.5.RELEASE</spring.version><!-- 将mybatis和有关的升级版本&#xff0c;设置为3.1.1--><my…...

物联网工程开发实施,应该怎么做?

我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 物联网工程的概念 物联网工程是研究物联网系统的规划、设计、实施、管理与维护的工程科学&#xff0c;要求物联网工程技术人员根 据既定的目标&#xff0c;依照国家、行业或企业规范&#xff0c;制定物联网…...

mysql使用SUBSTRING_INDEX拆分字符串,获取省、市、县和详细现住址

mysql使用SUBSTRING_INDEX拆分字符串&#xff0c;获取省、市、县和详细现住址 一、如何把"江西-上饶市-广丰县-大南镇古村村张家82号"拆分为省、市、县和详细现住址二、mysql的解决办法 一、如何把"江西-上饶市-广丰县-大南镇古村村张家82号"拆分为省、市、…...

Kubernetes中的就绪(readinessProbe)和存活(livenessProbe)探针

目录 案例一 案例二 readinessProbe就绪探针 readinessProbe就绪探针的作用 livenessProbe存活探针 livenessProbe存活探针的作用 探针的几种类型 探针的几个参数...

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述&#xff1a; 二、案例实验&#xff1a; 1、-P选项&#xff0c;随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port&#xff0c;任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…...

俄罗斯方块

俄罗斯方块简单实现 使用 pygame 模块实现俄罗斯方块的简单实现&#xff0c;这里没有使用pygame 自带的碰撞检测&#xff0c;而是自定义的方法实现边界碰撞和方块间碰撞检测。 代码实现 import random import pygame import time # 初始化游戏 pygame.init()# 设置游戏窗口大…...

web服务

静态网页与动态网页的区别 在网站设计中&#xff0c;静态网页是网站建设的基础&#xff0c;纯粹 HTML 格式的网页通常被称为“静态网页”&#xff0c;静态网页是标准的 HTML 文件&#xff0c;它的文件扩展名是 .htm、.html&#xff0c;可以包含文本、图像、声音、FLASH 动画、…...

【Rust 基础篇】Rust类型别名:为类型赋予新的名字

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;其设计哲学是在不损失性能的前提下&#xff0c;保障代码的内存安全和线程安全。在Rust中&#xff0c;类型别名是一种常见的编程特性&#xff0c;它允许为现有类型赋予新的名字&#xff0c;从而提高代码的可读…...

【机器学习】 贝叶斯理论的变分推理

许志永 一、说明 贝叶斯原理&#xff0c;站在概率角度上似乎容易解释&#xff0c;但站在函数立场上就不那么容易了&#xff1b;然而&#xff0c;在高端数学模型中&#xff0c;必须要在函数和集合立场上有一套完整的概念&#xff0c;其迭代和运算才能有坚定的理论基础。 二、贝叶…...

Flink之RedisSink

在Flink开发中经常会有将数据写入到redis的需求,但是Flink官方并没有对应的扩展包,这个时候需要我们自己编译对应的jar资源,这个时候就用到了bahir,barhir是apahce的开源项目,是专门给spark和flink提供扩展包使用的,bahir官网,这篇文章就介绍下如何自己编译RedisSink扩展包. 下…...

STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯

K210模块的串口发送代码 引入模块 import sensor, image,time,lcd,utime import KPU as kpu import gc, sys from fpioa_manager import fm from machine import UART 锁定引脚 和 申明串口 fm.register(9, fm.fpioa.UART1_TX, forceTrue) fm.register(10, fm.fpioa.UART1_R…...

睿讯微带你深度了解汽车交流充电桩

这几年随着新能源汽车的普及&#xff0c;充电桩也越来越多的出现在我们的视野中。新能源纯电汽车就好比一种大号的电子产品&#xff0c;而充电桩则是它不可缺少的子系统&#xff0c;是新能源车主们的必要选择。 汽车充电桩分为直流和交流两种&#xff0c;2022年底全国公共充电桩…...

word怎么压缩到10m以下?文件压缩很简单

Word文档是我们工作和学习中一直需要用到的&#xff0c;但有时候Word文档体积过大&#xff0c;给存储和传输带来了不便&#xff0c;这时候我们可以做的就压缩Word。 通常情况下&#xff0c;影响Word文档过大的主要因素主要是图片过多、音视频插入、格式的设置、文字内容的增多以…...

I.MX6ULL_Linux_驱动篇(43)linux通用LED驱动

前面我们都是自己编写 LED 灯驱动&#xff0c;其实像 LED 灯这样非常基础的设备驱动&#xff0c; Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 platform 框架&#xff0c;因此我们只需要按照要求在设备树文件中添加相应的 LED 节点即可&#xff0c;本章我们就来学习如…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...