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