×

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

分类:域名资讯 编辑:互联网观察 浏览量:142
2021-04-28 14:00:39

  现在有很多朋友对于域名解析的情况不是很了解,它其实指的是把域名转化为对应的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 = sizeof(SOCKADDR_IN);
  return recvfrom( s, buf, len, 0, (SOCKADDR *)&addrFrom, &addrlen);
  }
  /
  int ChName(char *fname,char *tname);//域名转化
  bool SetDNSHead(char *name,char *buf)
  {
  memset(buf,0,sizeof(DnsHead));
  //设置头部
  DnsHead *DnsH = (DnsHead *)buf;
  DnsH->ID = (USHORT)1;
  DnsH->tag = htons(0x0100);
  DnsH->numQ = htons(1);
  DnsH->numA = 0;
  DnsQuery *DnsQ =(DnsQuery *) ( buf+ sizeof(DnsHead) );
  int 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;
  tname[i+2] = 0;
  int k = i+1;
  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;
  }
 
  DNS域名解析流程剖析
  域名解析的流程,每个步骤如下:
  1) 客户端通过浏览器访问域名网站,发起查询该域名的 IP 地址的 DNS 请求。该请求发送到了本地 DNS 服务器上。本地 DNS 服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地 DNS 服务器还要向 DNS 根服务器进行查询。
  2) 本地 DNS 服务器向根服务器发送 DNS 请求,请求域名的 IP 地址。
  3) 根服务器经过查询,没有记录该域名及 IP 地址的对应关系。但是会告诉本地 DNS 服务器,可以到域名服务器上继续查询,并给出域名服务器的地址(.com 服务器)。
  4) 本地 DNS 服务器向 .com 服务器发送 DNS 请求,请求域名、的 IP 地址。
  5).com 服务器收到请求后,不会直接返回域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,该域名可以在 baidu.com 域名服务器上进行解析获取 IP 地址,并告诉域名服务器的地址。
  6) 本地 DNS 服务器向域名服务器发送 DNS 请求,请求域名的 IP 地址。
  7) 服务器收到请求后,在自己的缓存表中发现了该域名和 IP 地址的对应关系,并将IP地址返回给本地 DNS 服务器。
  8) 本地 DNS 服务器将获取到与域名对应的 IP 地址返回给客户端,并且将域名和 IP 地址的对应关系保存在缓存中,以备下次别的用户查询时使用。
  域名解析有哪些注意事项?域名解析基本知识详解
  一、A记录解析
  A记录解析是最为常见的域名解析方式,记录类型选择”A”,记录值填写空间商提供的主机IP地址,MX优先级不需要设置,TTL设置默认的3600即可。选择A记录时,需要设定域名或者子域名指向,通常需要注意以下3点:
  1. 做A记录时, 对应值必须是IP地址;
  2. 主机名必须填写,用@可以表示主机名为空;
  3. 泛域名解析,请在主机名处输入*,增加A记录即可。
  A记录对于网站优化来说是蜘蛛最为喜欢的一种方式,因为蜘蛛每次爬取网站都是固定的一个IP,能够避免不必要的错误。不过A记录对于使用不同网络访问网站的用户来说,有一定的短处,例如网站放在电信服务器上,如果是联通的用户访问,网站打开速度就会有一定的影响。
  二、CNAME记录解析
  CNAME类型解析设置的方法和A记录类型基本是一样的,其中将记录类型修改为”CNAME”,并且记录值填写服务器主机地址即可。不过对应的值不是一个固定的IP,而是主机的别名地址,以新网为例别名解析步骤为:
  1. 在主机名处填写www或者其他名称;
  2. 在记录类型选择类型为CNAME记录;
  3. 在记录值填写别名地址;
  4. 点击立即添加,完成添加别名解析。
  三、MX记录解析

  MX记录是相对用到较少的一种解析,MX记录是做邮箱解析使用的。记录类型选择MX,线路类型选择通用或者同时添加三条线路类型为电信、网通、教育网的记录;记录值填写邮局商提供的服务器IP地址或别名地址;TTL设置默认的3600即可,MX优先级填写邮局提供商要求的数据,或是默认10,有多条MX记录的时候,优先级要设置不一样的数据。


  c语言域名解析方法是怎样的?以上就给大家介绍了关于c语言域名解析方法的问题,大家在做c语言域名解析的时候,就可以按照上面的步骤去做,这个是需要耐心的去做的,千万不要着急,要不然就可能会出错了。如果大家在做c语言域名解析的过程中,还有不懂的地方,可以咨询新网。


声明:免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发

送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。本站原创内容未经允许不得转载,或转载时

需注明出处:新网idc知识百科

免费咨询获取折扣