要完成把一个外网ip地址转换成域名,,,查了很多资料。不知道该怎么办。查资料有2种解释  1:反向解析首先要求被解析的机器的DNS支持;很遗憾,国内大多数ISP并不提供这种服务,所以无论用什么开发工具,也不能反向解析出域名
2:通过dnsjava第三方jar实现我有以下代码  public static String reverseDns(String hostIp) throws IOException {
         Resolver res = new SimpleResolver();
         Name name = ReverseMap.fromAddress(hostIp);
         int type = Type.PTR;
         int dclass = DClass.IN;
         Record rec = Record.newRecord(name, type, dclass);
         Message query = Message.newQuery(rec);
         Message response = res.send(query);         Record[] answers = response.getSectionArray(Section.ANSWER);
         if (answers.length == 0)
            return hostIp;
         else
            return answers[0].rdataToString();
   }  网上说这个例子可以执行,我试了怎么还是不行。。哪为大虾给个帮助呀。。

解决方案 »

  1.   

    1:反向解析首先要求被解析的机器的DNS支持;很遗憾,国内大多数ISP并不提供这种服务,所以无论用什么开发工具,也不能反向解析出域名上面这句说得很清楚了.DNS服务器一般不提供反向解析,如果说有谁能提供这样的JAR包来反向解析IP地址,那么我倒想知道是怎么实现的.
      

  2.   

    如果DNS不支持的话,估计是没办法了。
    除非你能搞到dns的数据库,然后反过来查。哈哈,能耐大了!
      

  3.   

    unsigned int DNS_MakDnsInverseReqPkt(unsigned char *buf, unsigned int *buflen, unsigned int ulIP, unsigned short flag)
    {
        DNS_HEAD_S *pstDNS_head = NULL;
        DNS_QUST_S query_name = {0};
        unsigned char *cur = NULL;
        int len = 0;
        
        if(buf == 0)
        {
            return 1;
        }    
        if(flag == 1) /*tcp flag is '1'*/
        {
            buf += 2;/*预留2字节*/        
        }    pstDNS_head = (DNS_HEAD_S *)buf;
        
        pstDNS_head->usTransID = get_random();
        pstDNS_head->usFlag = 0x0100;    pstDNS_head->usQutn = 1;    dns_head_hton(pstDNS_head);    cur = buf + sizeof(DNS_HEAD_S);    
        len = dns_mak_dom_inverse_qNameStr(query_name.ucName, ulIP);    
        printf("DNS_ParaseDnsRespPkt line = %u\r\n", __LINE__);
        
        query_name.usQType = Q_PTR;
        query_name.usQClass = 1;    dns_qust_hton(query_name);/*    snprintf(cur, len, "%s", query_name.ucName);*/
        memcpy(cur, query_name.ucName, len);
        cur += len;
        
        memcpy(cur, &query_name.usQType, sizeof(query_name.usQClass) + sizeof(query_name.usQType));
        cur += sizeof(query_name.usQClass) + sizeof(query_name.usQType);
        *buflen = cur - buf;    if(flag == 1) /*tcp flag is '1'*/
        {
            len = cur - buf;
            len = htons(len);
            buf -= 2;/*预留2字节*/
            memcpy(buf, &len, 2);
            *buflen = cur - buf;
        }    
        return 0;
    }
      

  4.   

    1:dns服务器必须要支持反向查询
    2:如果反向查询的应答报文数据量较多,可能存在截断(TC 标志为1),则还需要重新构造查询报文,建立同dns服务器的tcp连接。上面中的flag标志用于区分TC标志为1,如果TC标志为1,则dns消息头部最前面2字节为dns头部的实际长度。