Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5771888
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2007-05-24 09:47:47

昨天在CU上面问了一个弱智的问题,倍感惭愧啊!
wangyao@fisherman:~/Desktop$ cat 1.cpp
#include
using namespace std;

#include
#include
#include

uint ipfromstrg ( char* buf ) {

   char* cptr = buf;
   uint addr = 0;

   hostent* host;

   //----------------------------------------------------------------------------------------------

   while ( *cptr != '\0' && isspace (*cptr) ) cptr ++;
   if ( *cptr == '\0' ) return 0;

   if ( isalpha (*cptr) ) {
      host= gethostbyname (cptr);
      if ( host != NULL ) {
         addr= ((uint*) host->h_addr_list[0])[0];
                 // I don't know why do this
         if ( (addr & 0xffff) == 0x0a0a ) addr= ((uint*) host->h_addr_list[0])[1];
      }
   }
   else {
      addr= inet_addr (cptr);
   }

   return addr;
}

int main(int argc,char* argv[])
{
        uint nip=0;
    struct in_addr adr;
        if( argc!=2 )
        {
                cout<<"Error!"<                 exit(1);
        }

        nip = ipfromstrg(argv[1]);
    adr.s_addr=nip;

        cout<
        return 0;
}
上面 if ( (addr & 0xffff) == 0x0a0a ) addr= ((uint*) host->h_addr_list[0])[1];一句不是很清楚是什么意思?
以前使用gethostbyname的时候,都是使用的一个for循环,将所有解析的结果去出来(虽然一般只有一个),但是他这里就看不明白了。


maybe,只是过滤10.10.*.*的地址。可能是作者的网络中有一个域名解析服务器,会将一些域名解析成本地网络的机器,如果是本地网络的机器就,选择第二个解析结果。
如果在一个普通网络当中,不是10.10ip设置的,解析一个正好是10.10.*.*[根本不存在]的域名就有可能出现段错误,因为这样就会取第二个解析结果,有可能没有。

刚开始我还查
wangyao@fisherman:~/Desktop$ host 10.10.25.37
Host 37.25.10.10.in-addr.arpa not found: 3(NXDOMAIN)
wangyao@fisherman:~/Desktop$ host 10.10.2.37
Host 37.2.10.10.in-addr.arpa not found: 3(NXDOMAIN)

后来脑袋转过来了,10.10.*.*是保留ip,怎么会有一个公网的域名会解析成它呢。
阅读(3988) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~