日期:2014-05-16  浏览次数:20792 次

关于gethostbyname的一个疑问
为什么用这个函数得到的 ip有时候不对 比如用 www.sina.com 就不对。。。显示中搜公司还有 用 baidu.com 和www.baidu.com也不一样 后者是北京市 百度蜘蛛 前者是百度公司
(我每次都是 用 ip网站查的,来进行比对)

具体代码如下

#include<netdb.h>
#include<sys/socket.h>
#include<stdio.h>
int main(int argc,char ** argv)
{
  struct hostent * phost;
  char *hostname=argv[1];
  char *h_name;
  char **aliases;
  char ** ip_addr;
  int iptype;
  char str[32]; 
  int counter=1;

  if((phost=gethostbyname(hostname))==NULL){ //get pointer of host
  printf("no such name \n");
  }

  printf("standard name------>%s\n\n",phost->h_name);//official name

  for(aliases=phost->h_aliases;*aliases!=NULL;aliases++)
  { 
  printf("its aliases name---->%s\n\n",*aliases); // alaises 
  }
   
  if(phost->h_addrtype==AF_INET) // type of ip
  { 
  printf("IPTYPE-------> IPV4\n\n");
  }
  else if(phost->h_addrtype==AF_INET6)
  { 
  printf("IPTYPE-------> IPV6\n\n");
  }

  printf("the address lenght--->%d\n\n",phost->h_length); //length of ip
   
  ip_addr=phost->h_addr_list; //ip address
  while( *ip_addr!=NULL)
  {
  printf("the %d th address ----->%s\n\n",counter,inet_ntop(phost->h_addrtype,*ip_addr,str,sizeof(str)));
  counter++;
  ip_addr++;
  }


}
 

------解决方案--------------------
就是说这些大网站一般都不只一个服务器,也不只一个IP地址
会根据你的位置选择一个离你近,延迟小的服务器
所以得到不一样的IP地址也是正常的
------解决方案--------------------
同一Domain可能对应多个IP,逐个解析
------解决方案--------------------
[code=C/C++][/code]
#define DEF_SERV_NAME "domain"
  #define DEF_SERV_PROTO "udp"
  #define DEF_SERV_PORT 53
  
  int main(int argc, char *argv[])
  {
   unsigned char ans[ANS_LEN];
   int len, i;
   ns_msg ns;
   ns_rr rr;
   in_addr in;
   struct servent *se;
  
   if (argc < 2)
   {
   printf("%s domain_name\n", argv[0]);
   exit(0);
  
   }
  
   setservent(0);
   se = getservbyname(DEF_SERV_NAME, DEF_SERV_PROTO);//解析/etc/services
   if (res_init())
   {
   herror("res_init()");
   exit(-1);
   }
  
   if (se)
   {
   _res.nsaddr.sin_port = se->s_port ?: htons(DEF_SERV_PORT);
   if (strcasecmp(se->s_proto, DEF_SERV_PROTO))
   {
   _res.options |= RES_USEVC;//使用TCP而非UDP协议
   }
   }
  
   if ((len = res_query(argv[1], ns_c_in, ns_t_a, ans, ANS_LEN)) < 0)
   {
   herror("res_query()");
   exit(-1);
   }
  
   if (ns_initparse(ans, len, &ns))
   {
   herror("ns_initparse()");
   exit(-1);
  
   }
   //同一Domain可能对应多個IP,逐个解析
   for (i = 0; i < ns_msg_count(ns, ns_s_an); i++)
   {
   if (ns_parserr(&ns, ns_s_an, i, &rr))
   {
   herror("ns_parserr()");
   exit(-1);
   }
  
   if (ns_rr_type(rr) == ns_t_a)
   {
   printf("name:%s\n", ns_rr_name(rr));
   in.s_addr = htonl(ns_get32(ns_rr_rdata(rr)));
   printf("ip:%s\n", inet_ntoa(in));
   }
   }
   return 0;
  }
------解决方案-----------