【C/C++】用 C 语言手写 DNS 查询:理解 UDP 和协议报文

第一次写博客-C/C++软件开发工程师需要学习哪些东西? 学习路线概述概述数据结构和算法操作系统计算机网络数据库设计模式 概述 作为一名本科机械电子,研究生研究计算机视觉方向的211应届毕业生,如何才能从事C/C++软件开发类的工程师呢?如果能有机会进入大厂呢?跟大家一样,非科班出生的我一开始也很迷茫,经过大量查找资料,终于有了一条明确的方向,这里记录下来。 软件基础模块主要可以分成六个大的方向:C++基础、数据结构与算法、操作系统、计算机网络、数据库、设计模式等。跟大家一样,刚开始看到这些概念的时候,我也是懵比的,本科学的C语言,也顺利通过了江苏省计算机二级, 阅读详情

用 C 语言手写 DNS 查询:理解 UDP 和协议报文

学习代码:dns/dns.c

在这里插入图片描述

DNS 项目让我第一次比较具体地感受到:网络编程不只是 socket、sendto、recvfrom,更重要的是理解协议格式。UDP 本身只负责把一段数据发给对方,至于这段数据里每个字节是什么意思,要由应用层协议决定。DNS 查询就是一个很好的练习,因为它的头部固定,问题区可变,既有结构又不会过分复杂。

项目里定义了 DNS 头部:

struct dns_header
{
    uint16_t id;
    uint16_t flags;
    uint16_t questions;
    uint16_t answer;
    uint16_t authority;
    uint16_t additional;
};

这 12 个字节里,id 用来匹配请求和响应,flags 表示查询标志,questions 表示问题数量。写 DNS 请求时不能只把结构体随便发出去,还要注意网络字节序。多字节字段在网络上传输通常使用大端序,因此构造报文时需要 htons() 之类的转换。

DNS 问题区最有意思的是域名编码。普通字符串是 www.baidu.com,但 DNS 报文里不是直接这样放,而是按“长度 + 内容”的形式编码:

3www5baidu3com0

也就是说,每一段标签前面放一个长度字节,最后用 0 结束。这个格式一开始不直观,但它让解析方不需要扫描点号,只要读长度就知道下一段有多长。

UDP 部分的流程相对直接:

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
sendto(sockfd, request, request_len, 0,
       (struct sockaddr *)&server_addr, sizeof(server_addr));
recvfrom(sockfd, response, sizeof(response), 0, NULL, NULL);

我的理解是,UDP 的“简单”并不等于应用简单。它没有 TCP 的连接管理和可靠传输,所以速度快、开销低,适合 DNS 这种一次请求一次响应的场景。但也正因为它不保证可靠,应用层要能处理超时、丢包、响应解析失败等情况。

这个项目最大的收获是:学习网络协议要从字节层面理解。只会调用 API,遇到问题时容易停在表面;知道报文结构,才能解释为什么一个域名要这样编码,为什么响应里可能有压缩指针,为什么同样是网络通信,DNS 和 HTTP 的处理方式完全不同。

学习链接: https://github.com/0voice

测开/测试面经(个人) ADI 电话面试: 自我介绍: linux:vim/vi 快速定位、编辑、回到顶部和底部 Vim定位行 vi,vim快捷键总结 linux 常用命令 linux常用命令 项目 get 和post 的区别 get和post区别 提交要什么? js里的回调函数 js的回调函数 字符串饭庄、大写、小写、大小写 python实现生成字符串大小写字母和数字的各种组合 python列表字符串互转和反转输出 英... 阅读详情

相关推荐

TCP、UDP、QUIC协议核心机制与实战选型指南

传输层协议是网络通信的基石,负责在端到端之间提供可靠或高效的数据传输服务。其核心原理在于通过不同的机制管理数据包的发送、确认和流量控制,以确保网络资源的合理利用和应用的稳定运行。从技术价值看,理解传输层协议是实现高性能网络应用、进行有效网络问题排查的关键。在实际工程中,不同的应用场景对延迟、可靠性和吞吐量的要求各异,这直接决定了协议的选择。例如,**拥塞控制**机制通过动态调整发送速率来避免网络过载,是TCP保证稳定性的核心;而**流量控制**则协调发送端与接收端的速度匹配,防止数据丢失。本文聚焦于TCP、

weixin_30530339的博客 363

DNS解析协议的C语言简单实现

DNS解析协议的C语言简单实现2010年5月11日 | 分类: Protocol | 标签: C/C++, udp, 协议分析细看了看DNS协议的相关东西,其实实际编程的时候根本用不到DNS细节的东西,要获取域名的时候经终端下用host或者nslookup指令就可以,在c里面使用gethostbyname或者getaddrinfo都能很轻松得将dns域名解析为ip地址,写这个纯粹出于个人兴趣,或者说是闲得吧。在进行域名解析的时候,解析程序向域名服务器发起请求,域名服务器也就是在操作系统网络配置的时候写进去的

kerson的专栏 9020

Linux高性能服务器编程|阅读笔记:第1章 - TCP/IP协议族

参考书籍:《Linux高性能服务器编程》文章仅作为个人学习笔记记录,记录从0到1的一个过程希望对您有一点点帮助,如有错误欢迎小伙伴指正。

海到无边天作岸 山登绝顶我为峰 1900

DNS c语言实现 可ping验证

DNS服务器功能实现: 程序创建UDP套接字,端口设置为53(dns服务器指定端口)接收DNS报文,程序通过DNS报文协议定位到报文请求的请求响应报文字段,通过analysis函数解析请求域名实现域名获取,将获取到的域名与服务器本地内存中的域名进行对比,当域名与本地域名相互匹配时,程序将通过package函数实现DNS响应报文的封装,根据本地域名匹配的IP地址进行响应报文的封装和发送,此时请求端将收到相对于的DNS响应报文并获取到请求域名的IP,当请求域名与本地域名不匹配时程序返回0,拒绝DNS响应。 设计

GOOD__YOUTH的博客 1861

C++实战项目:高并发IM聊天软件开发(类似QQ)

序列化是指将内存中的对象状态转化为一种可以被存储或传输的线性格式的过程。例如,一个包含用户名、密码和设备标识的类对象,不能直接写入套接字或保存到文件中,必须先“扁平化”为字符串或二进制流。在IM系统中,序列化广泛应用于以下关键环节:网络通信封包:客户端向服务器发送登录请求时,需将用户输入封装为标准格式的消息体;本地缓存持久化:聊天记录以结构化形式写入SQLite数据库前,通常需进行序列化处理;配置管理。

weixin_42323064的博客 1169

OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域

OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习等领域。本文将介绍OpenCV中的一些基础功能,包括如何绘制图形、创建图像金字塔以及如何处理感兴趣区域(ROI)。

吾家有猫名探花的博客 1962

DNS简介以及c语言实现DNS域名解析

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为 将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。如果我们想要去访问百度,通常我们回输入百度的域名:"www.baidu.com"。但其实我们访问互联网时,计算机网络提供的都是由数字构成的IP地址(如“43.139.121.27"),这种IPV4地址很难记住,因此他来了,DNS服务的出现,建立了IP地址(43.139.121.27)和域名(www.baidu.com)之间的对应关系。

qq_57259389的博客 1744

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 412

DNS协议与请求的C语言实现

C语言实现UDP协议请求

m0_54135264的博客 3516

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

app编写需要哪种语言

原生App开发:优选Swift(iOS)和Kotlin(Android)。跨平台App开发:优选Flutter(Dart)和React Native(JavaScript)。游戏App开发:优选Unity(C#)和Unreal Engine(C++)。低代码工具:适合简单、快速的App制作。

fanying_98的博客 2070

【亲测免费】 推荐开源项目:dns.c——高效灵活的非阻塞DNS解析库

推荐开源项目:dns.c——高效灵活的非阻塞DNS解析库 项目简介 dns.c是一个重量轻、高效的DNS解析库,其精华被封装在单个.c文件中。由William Ahern开发并维护,该项目自2008年起活跃至今,已被硅谷多家巨头在内的众多项目所采用。源代码托管于GitHub,确保了其社区参与度和更新便利性。 技术深度剖析 本项目最大的亮点之一在于其无依赖的设计,使得集成变得异常轻松。它既支持简单...

gitblog_00822的博客 1360

3A之自动对焦(AF)算法:从Tenegrad到拉普拉斯的清晰度评价实战

本文深入解析自动对焦(AF)算法的核心——清晰度评价函数,通过实战对比Tenegrad、方差、能量梯度、Brenner和拉普拉斯五大经典算法的原理、代码实现与性能。文章详细阐述了各函数在计算速度、抗噪性和单峰性上的优劣,并提供了从仿真测试到硬件部署的优化策略,帮助开发者根据实际场景选择最合适的AF算法。

weixin_29281915的博客 313

Linux下C/C++实现DNS查询(DNS QUERY)

DNS 的全称是 Domain Name System 或者 Domain Name Service,它主要的作用就是将人们所熟悉的网址 (域名) “翻译”成电脑可以理解的 IP 地址,这个过程叫做 DNS 域名解析。域名是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识。

chen1415886044的博客 4120

k8s配置habor作为镜像地址之后,如果harbor中没有镜像,如何设置自动从阿里云官方镜像仓库下载

通过 Harbor 的远端仓库可以集中管理。如果你在上游设置了 image prefix 为 library,那么对外访问 harbor.your-domain.com/library/nginx:latest 就会被 Harbor 去上游拉取 registry.cn-hangzhou.aliyuncs.com/library/nginx:latest 并缓存。- 将集群中的镜像地址改为 Harbor 的域名,比如 harbor.your-domain.com/library/nginx:latest。

极客栈 423

C++ int转四字节数组

字节转换

我不是码农的博客~~~ 973

【Linux网络】深入理解传输层 UDP 协议:从底层原理到实战应用

传输层是 TCP/IP 协议栈的核心枢纽,承担着端到端数据传输的关键职责,解决了 “数据从哪个应用来,到哪个应用去” 的根本问题。在传输层两大核心协议中,TCP 以其复杂的可靠传输机制闻名,而 UDP 则以极致的简单性和高效性独树一帜。很多开发者认为 UDP"简单到没什么可学的",但正是这种简单性赋予了它极高的灵活性 ——DNS、DHCP、视频直播、游戏联机等场景都离不开 UDP 的支撑。本文将从端口号基础开始,深入解析 UDP 的协议格式、内核封装过程、核心特性与缓冲区机制,结合 Linux 内核源码片段

会当凌绝顶,一览众山小 4723

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

无状态TCP技术:DNS代理的轻量级实现逻辑与核心原理(C/C++代码实现)

日常上网离不开DNS(域名系统),但很少有人注意到:DNS默认用UDP协议传输,可一旦查询结果超过512字节(比如包含大量IP的CDN域名),客户端就会自动切换到TCP 53端口重新请求。传统的TCP DNS服务需要维护每一个连接的状态(比如三次握手、四次挥手的上下文),高并发时会消耗大量服务器资源;而“无状态TCP”技术能绕开连接维护,用更轻量的方式处理TCP DNS请求,甚至能实现DNS请求的转发或劫持——这就是我们今天要拆解的核心技术思路。

chen1415886044的博客 1025

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FreeCAD 插件管理器实战:挑对、装对、调对,让建模工具跟着你的节奏走

FreeCAD 插件能把通用建模器改造成你的专用工具,FreeCAD 插件管理器则负责挑、装、调三个环节。这篇手记把从选插件到排故障的完整链路讲清楚,装完就能跑,不踩空。 ## 什么场景下你会需要 FreeCAD 插件 先说三个我踩过的坑,你看有没有中过。 做机械件时,一个法兰盘、一段螺纹、一组定位孔,每次都从头画。标准件重复劳动吃掉了你大半时间,可这些图形你根本不想再画第二遍。 做建筑参

gitblog_00557的博客 413

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C/C++之网络编程

人与人沟通的方式有很多:书信、电话、qq、等。两个人如果想沟通,必须选择一种沟通方式,一方用电话,另一方也应该用电话,而不是书信。人与人聊天可以说反话,说套话,人脑是智能的所以可以理解,但是机器不是,机器是死板的,所以协议是网络通讯的规则,是约定。

m0_74078963的博客 1472

第一章:网络协议与互联网架构全解析笔记

本文摘要:文章系统介绍了计算机网络的基础知识,包括网络协议的三要素(语法、语义、时序)、TCP/IP四层模型(链路层、网络层、传输层、应用层)及各层功能。详细解析了HTTP协议格式、请求方法、状态码分类,以及Web前后端技术栈(HTML/CSS/JS、Java/Python等语言)。同时涵盖了URL常见协议类型、互联网访问全流程(从DNS解析到服务器处理响应),并简要说明了数据库、浏览器等关键组件的功能作用。内容全面覆盖了计算机网络的核心概念和技术要点。

2401_88349202的博客 490

计算机网络(TCP/IP面试大纲)

1,计算机网络主要指的就是TCP/IP协议栈,是互联网的基石 2,容易忘是因为TCP/IP技术栈有一大部分都隐藏于操作系统的内核态,较少被接触。 3,重点脉络: (1,反复记忆。2,多问为什么) 一、TCP/IP协议体系的认知 (1)分层。一部分处于用户态,一部分处于内核态。数据链路层,网络层,传输层封装于操作系统内核态。应用层存在于操作系统的用户空间,包括DNS,FTP,HTTPs,HTTP,工...

ljmiiianng的博客 592

Linux C++ UDP客户端封装:从socket系统调用到面向对象设计实践

在网络编程中,UDP(用户数据报协议)作为一种无连接的传输层协议,以其低延迟和轻量级特性,在实时通信、音视频传输和游戏同步等场景中发挥着关键作用。其核心原理是通过数据包直接发送,无需建立连接,牺牲了可靠性以换取更高的传输效率。在Linux环境下,使用C++进行UDP编程通常涉及socket、bind、sendto和recvfrom等底层系统调用。通过面向对象设计封装这些调用,可以构建高内聚、低耦合的UDP客户端类,这不仅提升了代码的可维护性和复用性,还体现了RAII(资源获取即初始化)等现代C++工程实践思

weixin_30509393的博客 430

【C语言网络编程】HTTP 客户端请求(域名解析过程)

host_to_ip在做 C 语言网络编程或模拟 HTTP 客户端时,第一步就离不开“”这一步。很多人可能直接复制粘贴一段的代码,但未必真正理解它的原理。深入剖析,并进一步带你了解 HTTP 请求是如何基于 TCP 通信进行的。

qq_64148519的博客 512

【C/C++基础回顾与总结】

个人关于C/C++基础学习的回顾与总结

weixin_44914838的博客 480
上一篇: 【C/C++】用状态机和字典树统计单词:从“能数”到“数得清楚”
下一篇: 【C/C++】用 C 写 HTTP 客户端
SilentSlot
博客等级 码龄16年 44粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值