要完成把一个外网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();
} 网上说这个例子可以执行,我试了怎么还是不行。。哪为大虾给个帮助呀。。
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();
} 网上说这个例子可以执行,我试了怎么还是不行。。哪为大虾给个帮助呀。。
除非你能搞到dns的数据库,然后反过来查。哈哈,能耐大了!
{
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;
}
2:如果反向查询的应答报文数据量较多,可能存在截断(TC 标志为1),则还需要重新构造查询报文,建立同dns服务器的tcp连接。上面中的flag标志用于区分TC标志为1,如果TC标志为1,则dns消息头部最前面2字节为dns头部的实际长度。