首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

关于gethostbyname的一个疑点

2012-10-05 
关于gethostbyname的一个疑问为什么用这个函数得到的ip有时候不对比如用 www.sina.com 就不对。。。显示中搜

关于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;
  }
------解决方案--------------------


按照你的思路,一个简单的程序dns.c

C/C++ code
#include<stdio.h>#include<stdlib.h>#include<netdb.h>#include<arpa/inet.h>int main(int argc, char **argv) {    struct hostent *host;    char str[100];    char addr[INET_ADDRSTRLEN];    char **p;    int c;    while (1){        c=0;        gets(str);                printf("%s\n",str);        if ((host=gethostbyname(str))==NULL){            perror("host");        break;        }        p=host->h_addr_list;            for (;*p!=NULL;p++){            c++;            inet_ntop(AF_INET, *p, addr, INET_ADDRSTRLEN);            printf("%d:%s\n", c, addr);        }    }    return 0;} 

热点排行