域名系统 DNS
DNS 概述
DNS 协议运行在 UDP 协议上面,是一个 UDP 的“回显”程序,使用 53 号端口
因特网的域名结构
DNS 协议
首部格式
数据区域

DNS 客户端程序实例
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/socket.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>int sock;
struct sockaddr_in sa;/*
generate_question:解析域名数据
*/
void generate_question(char*dns_name,char*buf,int*len)
{char*pos = dns_name;//指向域名当前位置char*ptr = buf;int n = 0;*len = 0;while(1){n = strlen(pos) - (strstr(pos , ".") ? strlen(strstr(pos , ".")) : 0);//在 pos 中查找"."子串//返回"."在 pos 中第一次出现的地址,若没有找到返回 NULLprintf("%d\n", n);*ptr++ = (unsigned char)n;memcpy(ptr,pos,n);printf("%lu\n",strlen(ptr));printf("%s\n", ptr);*len += n + 1;ptr += n;if(!strstr(pos , ".")){*ptr = (unsigned char)0;ptr ++;*len += 1;break;}pos += n + 1;printf("%s\n", pos);}
}/*
send_dns_request:解析域名数据,并发送数据包
*/
void send_dns_request(char * dns_name)
{unsigned char request[256] = {0}; //保存整个请求报文unsigned char *ptr = request;unsigned char question[128];//存储域名解析数据int question_len;//产生请求(把字符串表示的域名转换成 DNS 要求的格式)generate_question(dns_name , question ,&question_len);printf("%s\n", question);printf("%d\n", question_len);*((unsigned short*)ptr) = 1; //会话标识 IDptr += 2;*((unsigned short*)ptr) = htons(0x0100); //flagsptr += 2;*((unsigned short*)ptr) = htons(1); //Quetions 问题数,通常为 1ptr += 2;*((unsigned short*)ptr) = 0;ptr += 2;*((unsigned short*)ptr) = 0;ptr += 2;*((unsigned short*)ptr) = 0;ptr += 2;//把域名(www.baidu.com)装换为相应的问题格式保存在此处,以\0 结尾memcpy(ptr , question , question_len);ptr += question_len;*((unsigned short*)ptr) = htons(1); //获取 IPV4 地址,查询类型ptr += 2;*((unsigned short*)ptr) = htons(1); //指互联网地址,查询类,一般为 1,表明是 Internet 数据int re = sendto(sock, request,question_len+16 ,0, (structsockaddr*)&sa, sizeof(sa));printf("re = %d\n",re);int i;for(i=0;i<re;i++)//以 16 进制格式打印出来{printf("%02X ",(unsigned char)request[i]);} printf("===================\n");
}/*recv_dns_response:获取域名所对应的 IP 地址,并打印
*/
void recv_dns_response()
{struct sockaddr_in src_addr;socklen_t addrlen = sizeof(src_addr);char buf[255] = {0};int r = recvfrom(sock, buf, 255, 0, (struct sockaddr*)&src_addr,&addrlen);printf("r == %d\n", r);if(r > 0)//收到大于 0 的数据{int i;for(i=r-4;i<r;i++)//以 16 进制格式打印出来{if(i != r-1)printf("%d.",(unsigned char)buf[i]);elseprintf("%d\n",(unsigned char)buf[i]);} }
}//例./main www.baidu.com
int main(int argc, char *argv[])
{if(argc != 2){printf("Usage : %s <domain name>\n",argv[0]);return -1;}//step 1: 创建一个套接字sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == -1){perror("socket error:");return -1;}//step 2: 绑定一个地址(ip+端口号)memset(&sa, 0,sizeof(sa));sa.sin_family = AF_INET;sa.sin_port = htons(53); //按"网络字节序"来保存一个整数sa.sin_addr.s_addr = inet_addr("114.114.114.114");//发送解析请求send_dns_request(argv[1]);//接收分析结果recv_dns_response();close(sock);return 0;
}
域名解析函数(gethostbyname)
#include <netdb.h>
#include <sys/socket.h>
extern int h_errno;
struct hostent *gethostbyname(const char *name);
struct hostent
{char *h_name; /* 主机正式名称 */char **h_aliases; /* 别名列表。 */int h_addrtype; /* 主机地址类型。*/int h_length; /* 地址的长度。 */char **h_addr_list; /*来自名称服务器的地址列表。 */#ifdef __USE_MISC# define h_addr h_addr_list[0] /* 地址,用于向后兼容。*/#endif
};
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
extern int h_errno;int main(int argc, char **argv)
{if (argc != 2) {printf("Use example: %s www.google.com\n", *argv);return -1;}char *name = argv[1];struct hostent *hptr;hptr = gethostbyname(name);if (hptr == NULL) {printf("gethostbyname error for host: %s: %s\n", name, hstrerror(h_errno));return -1;}//输出主机的规范名printf("\tofficial: %s\n", hptr->h_name);//输出主机的别名char **pptr;char str[INET_ADDRSTRLEN];for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) {printf("\ttalias: %s\n", *pptr);}//输出 ip 地址switch (hptr->h_addrtype) {case AF_INET:pptr = hptr->h_addr_list;for (; *pptr!=NULL; pptr++) {printf("\taddress: %s\n",inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));}break;default:printf("unknown address type\n");break;}return 0;
}
获取本地主机名(gethostname)
#include <unistd.h>
int gethostname(char *name, size_t len);
char buf[256] = {0};
int t = gethostname(buf,256);
if(t == 0)
{printf("%s\n",buf);
}
设置本地主机名(sethostname)
#include <unistd.h>
int sethostname(const char *name, size_t len);
sethostname ( "jiuyue" , 6 );
相关文章:

域名系统 DNS
DNS 概述 域名系统 DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为 IP 地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”&#x…...

Vue $nextTick 模板解析后在执行的函数
this.$nextTick(()>{ 模板解析后在执行的函数 })...

VBA技术资料MF76:将自定义颜色添加到调色板
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
zilong-20231030
1)k个反转 2)n!转12进制 求末尾多少0 一共有几位 (考虑了溢出问题) 3)大量数据获取前10个 4)reemap地城结构 5)红黑树规则特性 6)热更 7)压测 8)业务 跨服实现 9)有哪些线程以及怎么分配...

目标检测算法发展史
前言 比起图像识别,现在图片生成技术要更加具有吸引力,但是要步入AIGC技术领域,首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站,会使用别人的模型生成一些图片就能叫自己会AIGC了吗?那样真正…...

React 生成传递给无障碍属性的唯一 ID
useId() 在组件的顶层调用 useId 生成唯一 ID: import { useId } from react; function PasswordField() { const passwordHintId useId(); // ...参数 useId 不带任何参数。 返回值 useId 返回一个唯一的字符串 ID,与此特定组件中的 useI…...

十种排序算法(1) - 准备测试函数和工具
1.准备工作 我们先写一堆工具,后续要用,不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…...
IRF联动 BFD-MAD
文章目录 IRF堆叠一、主设备配置二、备设备配置三、验证 MAD检测一、MAD检测二、MAD验证 本实验以2台设备进行堆叠示例,按照配置顺序,先配置主设备,再配置备设备。在IRF配置前暂时先不接堆叠线,按步骤提示接线。 IRF堆叠 一、主设…...

双向链表的初步练习
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”…...

IDE的组成
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…...

项目解读_v2
1. 项目介绍 如果使用task2-1作为示例时, 运行process.py的过程中需要确认 process调用的是函数 preprocess_ast_wav2vec(wav, fr) 1.1 任务简介 首个开源的儿科呼吸音数据集, 通过邀请11位医师标注; 数字听诊器的采样频率和量化分辨率分…...

杀毒软件哪个好,杀毒软件有哪些
安全杀毒软件是一种专门用于检测、防止和清除计算机病毒、恶意软件和其他安全威胁的软件。这类软件通常具备以下功能: 1. 实时监测:通过实时监测计算机系统,能够发现并防止病毒、恶意软件等安全威胁的入侵。 2. 扫描和清除:可以…...
Ubuntu上安装配置Nginx
要在 Ubuntu 上安装 Nginx,请按照以下步骤进行操作: 打开终端:可以使用快捷键 Ctrl Alt T 打开终端,或者在开始菜单中搜索 “Terminal” 并点击打开。 更新软件包列表:在终端中运行以下命令,以确保软件包…...

C++之string
C之string #include <iostream>using namespace std;/*string();//创建一个空的字符串string(const char* s);//使用字符串s初始化string(const string& str);//使用一个string对象初始化另外一个string对象string(int n,char c);//使用n个字符c初始化*/void test1()…...
多线程---单例模式
文章目录 什么是单例模式?饿汉模式懒汉模式版本一:最简单的懒汉模式版本二:考虑懒汉模式存在的线程安全问题版本三:更完善的解决线程安全问题版本四:解决指令重排序问题 什么是单例模式? 单例模式…...

SpringBoot相比于Spring的优点(自动配置和依赖管理)
自动配置 例子见真章 我们先看一下我们Spring整合Druid的过程,以及我们使用SpringBoot整合Druid的过程我们就知道我们SpringBoot的好处了。 Spring方式 Spring方式分为两种,第一种就是我们使用xml进行整合,第二种就是使用我们注解进行简化…...

SAP SPAD新建打印纸张
SAP SPAD新建打印纸张 1.事务代码SPAD 2.完全管理-设备类型-页格式-显示(创建格式页) 3.按标准A4纸张为模板参考创建。同一个纸张纵向/横向各创建1次(创建格式页) 4.完全管理-设备类型-格式类型-显示(创建格式类型࿰…...

C# 图解教程 第5版 —— 第11章 结构
文章目录 11.1 什么是结构11.2 结构是值类型11.3 对结构赋值11.4 构造函数和析构函数11.4.1 实例构造函数11.4.2 静态构造函数11.4.3 构造函数和析构函数小结 11.5 属性和字段初始化语句11.6 结构是密封的11.7 装箱和拆箱(*)11.8 结构作为返回值和参数11…...

车载电子电器架构 —— 基于AP定义车载HPC
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

Redis原理-IO模型和持久化
高性能IO模型 为什么单线程Redis能那么快 一方面,Redis 的大部分操作在内存上完成,再加上它采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。另一方面,就是 Redis 采用了多路复用机制&#…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...