socket编程实现简单DNS协议实现获取域名ip(TCP)

2024-06-18 12:48

本文主要是介绍socket编程实现简单DNS协议实现获取域名ip(TCP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上次在文章《socket编程实现简单DNS协议实现获取域名ip(UDP)》中提到使用udp协议发送dns数据包查询站点ip,这次带来TCP版本的查询代码。

其实不管是tcp协议还是udp协议,都是构造dns报文,填写查询方式,发送数据包即可。

然而,在dns协议中有个特殊的地方需要重点强调!使用tcp协议和udp协议发送的dns报文有个很容易被忽略的问题:在tcp协议时,除了udp协议时的dns报文数据,还要在原有的报文数据之前添加两个字节,这两个字节指名其后的dns报文数据有多少字节!

除了上述的区别,其他的都一样。

另外,再提个问题,其实在dns服务器返回的数据包中可能包含了同一个域名的多个ip地址,我们在UDP的那篇文章中只解析了最后一个提供的ip地址~,这次的tcp模式同时解析了所有返回的ip地址~

这次的代码使用了文章《socket编程之TCP通信模块》中的头文件。main函数文件代码如下:

#include <stdio.h>
#include <string.h>
#include "tcp_client.h"
typedef unsigned short U16;
const char srv_ip[] = "8.8.8.8";
#define R_OK    0
#define R_ERROR -1
/*typedef struct _DNS_HDR
{  U16 id;U16 tag;U16 numq;U16 numa;U16 numa1;U16 numa2;
}DNS_HDR;*/
typedef struct
{unsigned short id;       // identification numberunsigned char rd :1;     // recursion desiredunsigned char tc :1;     // truncated messageunsigned char aa :1;     // authoritive answerunsigned char opcode :4; // purpose of messageunsigned char qr :1;     // query/response flagunsigned char rcode :4;  // response codeunsigned char cd :1;     // checking disabledunsigned char ad :1;     // authenticated dataunsigned char z :1;      // its z! reservedunsigned char ra :1;     // recursion availableunsigned short q_count;  // number of question entriesunsigned short ans_count; // number of answer entriesunsigned short auth_count; // number of authority entriesunsigned short add_count; // number of resource entries
}DNS_HDR;
/*typedef struct _DNS_QER
{U16 type;U16 classes;
}DNS_QER;*/
typedef struct
{unsigned short type;unsigned short classes;
}DNS_QES;
int main(int argc, char **argv)
{unsigned char buff[1024];unsigned char *buf = buff + 2;unsigned char *p;int len, i;DNS_HDR  *dnshdr = (DNS_HDR *)buf;DNS_QES  *dnsqes = NULL;if (R_ERROR == tcp_client_init(argv[2], 53)){printf("Conn Error!\n");return -1;}else{printf("Conn OK!\n");}memset(buff, 0, 1024);dnshdr->id = htons(0x2000);//(U16)1;dnshdr->qr = 0;dnshdr->opcode = 0;dnshdr->aa = 0;dnshdr->tc = 0;dnshdr->rd = 1;dnshdr->ra = 1;dnshdr->z  = 0;dnshdr->ad = 0;dnshdr->cd = 0;dnshdr->rcode = 0;dnshdr->q_count = htons(1);dnshdr->ans_count = 0;dnshdr->auth_count = 0;dnshdr->add_count = 0;strcpy(buf + sizeof(DNS_HDR) + 1, argv[1]);p = buf + sizeof(DNS_HDR) + 1; i = 0;while (p < (buf + sizeof(DNS_HDR) + 1 + strlen(argv[1]))){if ( *p == '.'){*(p - i - 1) = i;i = 0;}else{i++;}p++;}*(p - i - 1) = i;dnsqes = (DNS_QES *)(buf + sizeof(DNS_HDR) + 2 + strlen(argv[1]));dnsqes->classes = htons(1);dnsqes->type = htons(1);buff[0] = 0; buff[1] = sizeof(DNS_HDR) + sizeof(DNS_QES) + strlen(argv[1]) + 2;if (R_ERROR == tcp_client_send(buff, sizeof(DNS_HDR) + sizeof(DNS_QES) + strlen(argv[1]) + 4)){printf("Send Error!\n");return -1;}else{printf("Send OK!\n");}len = tcp_client_recv(buff, 1024);if (len < 0){printf("Recv Error!\n");return -1;}else{printf("Recv OK!\n");}if (dnshdr->rcode !=0 || dnshdr->ans_count == 0){printf("Ack Error\n");return -1;}p = buff + 2 + sizeof(DNS_HDR) + sizeof(DNS_QES) + strlen(argv[1]) + 2;printf("Ans Count = %d\n", ntohs(dnshdr->ans_count));for (i = 0; i < ntohs(dnshdr->ans_count); i++){p = p + 12;printf("%s ==> %u.%u.%u.%u\n", argv[1], (unsigned char)*p, (unsigned char)*(p + 1), (unsigned char)*(p + 2), (unsigned char)*(p + 3));p = p + 4;}tcp_client_close();return 0;
}

执行结果如下:

[root@isayme socket]# ./dns_tcp isayme.org 8.8.8.8
Conn OK!
Send OK!
Recv OK!
Ans Count = 1
isayme.org ==> 173.231.29.114
[root@isayme socket]# ./dns_tcp google.com 8.8.8.8
Conn OK!
Send OK!
Recv OK!
Ans Count = 6
google.com ==> 74.125.71.106
google.com ==> 74.125.71.103
google.com ==> 74.125.71.147
google.com ==> 74.125.71.105
google.com ==> 74.125.71.104
google.com ==> 74.125.71.99


需要的头文件在文章《socket编程之TCP通信模块》中下载!

转自:https://blog.csdn.net/bytxl/article/details/10395089

这篇关于socket编程实现简单DNS协议实现获取域名ip(TCP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072039

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页: