读书人

关于gethostbyname的一个疑点

发布时间: 2012-10-05 15:34:34 作者: rapoo

关于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;} 

读书人网 >UNIXLINUX

热点推荐