当前位置: 首页 > 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;本章我们就来学习如…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...