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

写了两个程序,大家帮我看一下
(1)
int   main(int   argc,   char   *argv[])
{
                struct   in_addr   addr;
                struct   hostent   *host;
                inet_aton(argv[1],   &addr);
                host   =   gethostbyaddr(&addr,   sizeof(struct   in_addr),   AF_INET);
                printf( "host   is   %s\n ",   host-> h_name);
}
------------------------------------
(2)
int   main(int   argc,   char   **argv)
{
                struct   hostent   *hptr;
                char   **pptr;
                char   hostname[32];
                char   str[32];

                if((hptr   =   gethostbyname(argv[1]))   ==   NULL){
                                fprintf(stderr, "gethostbyname   calling   error   %s\n ",strerror(h_errno));
                                return   1;
                }
                pptr=hptr-> h_addr_list;
                for(;*pptr!=NULL;pptr++){
                                inet_ntop(hptr-> h_addrtype,   *pptr,   str,   sizeof(str));
                                printf( "     address:%s\n ",   str);
                }
                return   0;
}

第一个是把主机ip转化成name,第二个是把主机name转化成ip
我的问题是:为什么一个名字可以转化出多个ip,但是一个ip却只能转化出来一个主机名字,还有就是为什么用名字(www.sohu.com)转化出来的ip,再将他转化成名字,结果是断错误,请各位高手指点一下,谢谢了

------解决方案--------------------
对于第一个问题,一台主机只能有一个主机名,其它的都是别名,但是一台主机可以有多个IP地址。
对于第二个问题,由主机名转成IP多数情况下是可以的,只要是DNS能查到,但是由IP去求主机名,
这个有时候会不成功能,这个是因为DNS反向查找,可能会查不到。如果取不到的话,
就说明你的gethostbyaddr可能会返回NULL,这时你没有判断返回的指针是否是NULL,直接对它解引用,
就会发生段错误。