我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c语言中怎么做域名解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c语言中怎么做域名解析

c语言中怎么做域名解析

使用c语言实现域名解析的方法

c语言代码如下:

#include

#include

#include

typedef enum {false = 0, true = !false}bool;

typedef struct _DNSHEAD{ //dns 头部

USHORT ID;

USHORT tag; // dns 标志(参数)

USHORT numQ; // 问题数

USHORT numA; // 答案数

USHORT numA1; // 权威答案数

USHORT numA2; // 附加答案数

}DnsHead;

typedef struct _DNSQUERY //dns 查询结构

{

// char name[64];

// //查询的域名,这是一个大小在0到63之间的字符串;

USHORT type;

//查询类型,大约有20个不同的类型

USHORT classes;

//查询类,通常是A类既查询IP地址。

}DnsQuery;

#pragma comment(lib,"ws2_32.lib")

// 初始化操作

bool initWSA();

//显示错误

void displayErrWSA(char *str);

//创建套接字

SOCKET CreateSocket(int type);

//UDP sendto

int MySendto(SOCKET sockTo, const char FAR * buf,int len,char *addr,USHORT port);

//TCP 连接

bool MyConnect(SOCKET s, char *addr,USHORT );

// UDP recvfrom

int MyRecvFrom(SOCKET s, char FAR * buf,int len,char *addr,USHORT port);

//设置DNS 头部

bool SetDNSHead(char *name,char *buf);

int main(int arg,char *are[])

{

int Result=0;

char buf[1024]={0};

char addr[16] = "192.168.1.1";// dns 服务器地址

char *name = 0; //要查询的域名

SOCKET sockTo;

int len;

DnsHead *DnsH;

char *getIP;

//int i;

if ( !initWSA() )//初始化

{

displayErrWSA("initWSA err!");

return 1;

}

//创建套接字

if ( (sockTo = CreateSocket(SOCK_DGRAM)) == 0)

{

displayErrWSA("CreatSocket err!");

return 1;

}

while (1)

{

if (arg < 2)

{

char temp[1024]={0};

printf("\n请输入要查询的域名:");

scanf("%s",temp);

if (temp[0] == 'q' ||temp[0] == 'Q')

{

break;

}

name = temp;

}

else

{

arg = 1;

name = are[1];

}

//设置dns 头部

SetDNSHead(name,buf);

//发送出去的请求数据长度

len = sizeof(DnsHead)+sizeof(DnsQuery)+strlen(name)+2;

// for (int i =0;i<50;i+=2)

// {

// printf("x",(UCHAR)buf[i]);

// printf("x ",(UCHAR)buf[i+1]);

// }

//发送DNS 请求

if ( ( Result =MySendto(sockTo,buf,len,addr,53) ) <= 0)

{

displayErrWSA("sendto err!");

continue;

}

//接收应答

if ( (Result =MyRecvFrom(sockTo,buf,1024,addr,53) ) <= 0)

{

displayErrWSA("recvfrom err!");

continue;

}

//简单的取得返回的 IP 地址( 收到的最后4字节 )

DnsH = (DnsHead *)buf;

if (DnsH->numA == 0)

{

printf("无法解析 %s 的IP 地址。\n",name);

continue;

}

getIP =(char *)buf +Result - 4;

printf("%s 的IP地址为: ",name);

for (Result= 0 ;Result<4 ;Result++)

{

printf("%u.",(UCHAR )getIP[Result]);

}

printf("\n");

}

return 0;

}

// 初始化操作

bool initWSA()

{

WORD wVersionRequested;

WSADATA wsaData;

int Result;

wVersionRequested = MAKEWORD( 2, 2 );

Result = WSAStartup( wVersionRequested, &wsaData );

if(Result != 0 )

{

return false;

}

if( LOBYTE( wsaData.wVersion) != 2 ||

HIBYTE(wsaData.wVersion)!= 2 )

{

WSACleanup();

return false;

}

return true;

}

SOCKET CreateSocket(int type)

{

SOCKET sock=socket(AF_INET,type,0);

if (sock == INVALID_SOCKET )

{

return 0;

}

return sock;

}

int MySendto(SOCKET sockTo, const char FAR * buf,int len,char *addr,USHORT port)

{

//设置发送数据到的 套接字及地址结构

SOCKADDR_IN addrTo;

addrTo.sin_addr.S_un.S_addr=inet_addr(addr);

addrTo.sin_family=AF_INET;

addrTo.sin_port=htons(port);

return sendto( sockTo, buf, len, 0,

(struct sockaddr *)&addrTo, sizeof(struct sockaddr) );

}

bool MyConnect(SOCKET sockTo, char *addr,USHORT port)

{

int Result;

//设置连接到的 套接字及地址结构

SOCKADDR_IN addrTo;

addrTo.sin_addr.S_un.S_addr=(inet_addr(addr));

addrTo.sin_family=AF_INET;

addrTo.sin_port=htons(port);

//连接

Result = connect(sockTo,(struct sockaddr *)&addrTo,sizeof(SOCKADDR_IN));

if(SOCKET_ERROR == Result)

{

return false;

}

return true;

}

int MyRecvFrom(SOCKET s, char FAR * buf,int len,char *addr,USHORT port)

{

//设置发送数据到的 套接字及地址结构

int addrlen;

SOCKADDR_IN addrFrom;

addrFrom.sin_addr.S_un.S_addr=inet_addr(addr);

addrFrom.sin_family=AF_INET;

addrFrom.sin_port=htons(port);

addrlen = sizeof(SOCKADDR_IN);

return recvfrom( s, buf, len, 0, (SOCKADDR *)&addrFrom, &addrlen);

}

int ChName(char *fname,char *tname);//域名转化

bool SetDNSHead(char *name,char *buf)

{

DnsHead *DnsH;

DnsQuery *DnsQ;

int NameLen;

memset(buf,0,sizeof(DnsHead));

//设置头部

DnsH = (DnsHead *)buf;

DnsH->ID = (USHORT)1;

DnsH->tag = htons(0x0100);

DnsH->numQ = htons(1);

DnsH->numA = 0;

DnsQ =(DnsQuery *) ( buf+ sizeof(DnsHead) );

NameLen = ChName(name,(char *)DnsQ);

//设置查询信息

DnsQ = (DnsQuery *)( (char *)DnsQ + NameLen );

DnsQ->classes = htons(1);

DnsQ->type = htons(1);

return true;

}

//显示错误信息

void displayErrWSA(char *str)

{

printf("\n%s,err = %d\n",str,WSAGetLastError());

getchar();

}

//域名转化

int ChName(char *fname,char *tname)

{

int j =0;

int i =strlen(fname)-1;

int k = i+1;

tname[i+2] = 0;

for (; i>=0;i--,k--)

{

if (fname[i] == '.')

{

tname[k] = j;

j=0;

}

else

{

tname[k] = fname[i];

j++;

}

}

tname[k] = j;

return strlen(tname)+1;

}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c语言中怎么做域名解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

虚拟主机怎么做域名解析

要做虚拟主机的域名解析,您需要按照以下步骤进行操作:1. 登录您的域名注册商的网站,找到域名管理页面。2. 在域名管理页面,找到DNS解析设置或者域名解析设置选项。3. 在DNS解析设置页面,添加一条新的解析记录。4. 在解析记录中,选择类
2023-08-16

c++中curl无法解析域名怎么解决

如果cURL在解析域名时遇到困难,可能是由于网络配置问题或cURL库本身的问题。以下是一些可能的解决方案:确保网络连接正常:首先确保您的计算机能够连接到互联网,并且没有任何网络配置问题。检查DNS设置:检查您的计算机的DNS设置是否正确,您
c++中curl无法解析域名怎么解决
2024-04-09

c语言位域怎么用

c 语言位域位域是一种数据类型,允许将数据存储在单个字节或单词的特定位集合中。它使用一个结构来定义位域,其中每个位域成员都有一个特定的偏移量和大小。使用位域的步骤:定义结构:使用 struct 关键字定义一个结构体。使用 bit-fi
c语言位域怎么用
2024-05-21

域名被泛解析后要做什么

这篇文章主要讲解了“域名被泛解析后要做什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“域名被泛解析后要做什么”吧! 域名被泛解析的情况在何时都是教人担心的,那么在域名被泛解析后我们要做些什
2023-06-06

c语言类型转换怎么做

c语言中的类型转换可将一种数据类型的值转换为另一种,隐式转换由编译器自动执行,显式转换由程序员通过强制转换符手动指定。隐式转换自动将低精度值转换为高精度值,而显式转换则需要考虑数据丢失、精度降低和未定义行为等注意事项。C语言类型转换在C语
c语言类型转换怎么做
2024-04-13

C语言中怎么命名标识符

这期内容当中小编将会给大家带来有关C语言中怎么命名标识符,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解
2023-06-03

c语言怎么做出可视窗口

在C语言中,可以使用图形库来创建可视窗口并进行图形化界面的开发。以下是几个常用的图形库:1. SDL(Simple DirectMedia Layer):SDL是一个跨平台的多媒体库,提供了访问音频、键盘、鼠标、图像和窗口等功能。通过使用S
c语言怎么做出可视窗口
2024-02-29

CN域名该怎么解析

本篇文章为大家展示了CN域名该怎么解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 如果说注册域名是搭建网站的第一步,那么第二步就是域名解析了,那么接下来小编就为大家解答一下CN域名怎么解析?很多
2023-06-06

解析域名怎么操作

解析域名的操作步骤如下:1. 登录域名管理后台,找到“DNS解析”或“域名解析”等相关设置选项。2. 添加解析记录,包括主机记录、记录类型、记录值等信息。其中,主机记录可以是“@”表示根域名,也可以是子域名,如“www”、“mail”等;记
2023-06-14

c语言编程显示图案怎么做

在 c 语言中,通过使用循环和字符,可以显示图案。步骤包括:使用循环和 printf() 函数创建行。使用换行符创建新行。嵌套循环以创建更复杂的图案,如三角形。C 语言编程中显示图案如何使用 C 语言编程显示图案?在 C 语言中,可以通
c语言编程显示图案怎么做
2024-04-13

c语言怎么做出可视化窗口

在C语言中,要创建可视化窗口,你可以使用图形库或框架。以下是一些常用的选项:1. SDL(Simple DirectMedia Layer):它是一个跨平台的多媒体库,可以用于创建2D游戏和图形应用程序。2. GTK+:这是一个流行的GUI
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录