c语言域名解析方法是怎样的?域名解析的流程有哪些?

发布时间:2023-08-03 点击:107
现在有很多朋友对于域名解析的情况不是很了解,它其实指的是把域名转化为对应的ip地址的过程,这个工作是由dns服务器来完成的,这个过程其实并不是很复杂,但是很多朋友会对各种解析的方式容易混淆,比如做c语言域名解析,这个看起来非常的抽象,不容易理解,那么c语言域名解析方法是怎样的?域名解析的流程有哪些呢?下面就给大家详细的来阐述一下。
c语言域名解析方法是怎样的?
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之间的字符串;
c语言域名解析
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] = 61.187.72.8;// dns 服务器地址
char *name = 0; //要查询的域名
if ( !initwsa() )//初始化
{
displayerrwsa(initwsa err!);
return 1;
}
//创建套接字
socket sockto ;
if ( (sockto = createsocket(sock_dgram)) == 0)
{
displayerrwsa(creatsocket err!);
return 1;
}
while (1)
{
if (arg
{
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);
//发送出去的请求数据长度
int len = sizeof(dnshead)+sizeof(dnsquery)+strlen(name)+2;
// for (int i =0;i
// {
// printf(x,(uchar)buf[i]);
// printf(x ,(uchar)buf[i+1]);
// }
//发送dns 请求
if ( ( result =mysendto(sockto,buf,len,addr,53) )
{
displayerrwsa(sendto err!);
continue;
}
//接收应答
if ( (result =myrecvfrom(sockto,buf,1024,addr,53) )
{
displayerrwsa(recvfrom err!);
continue;
}
//简单的取得返回的 ip 地址( 收到的最后4字节 )
dnshead *dnsh = (dnshead *)buf;
if (dnsh->numa == 0)
{
printf(无法解析 %s 的ip 地址。\n,name);
continue;
}
char *getip =(char *)buf +result - 4;
printf(%s 的ip地址为: ,name);
for (int result= 0 ;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,
(sockaddr*)&addrto, sizeof(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,(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)
{
//设置发送数据到的 套接字及地址结构
sockaddr_in addrfrom;
addrfrom.sin_addr.s_un.s_addr=inet_addr(addr);
addrfrom.sin_family=af_inet;
addrfrom.sin_port=htons(port);
int addrlen = s

网站设计要与消费者建立良好的互动体验
电商网站建设注意事项有哪些
企业网站在什么情况下需要考虑重新改版?
网站建设前的准备工作都有哪些?
武则天墓极有可能出土,国家文物局等再次研究是否大规模勘探!
网站需要避免哪些设计才能吸引访客目光
网站更新与网站推广相结合才能达到网站优化的目的
面对新站点如何开展SEO工作?