免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4113 | 回复: 0
打印 上一主题 下一主题

[DNS] 高手帮忙分析一段C代码,有关DNS解析的,res_init,res_query. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-15 08:55 |只看该作者 |倒序浏览
#include <sys/socket.h>;
#include <sys/types.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;
#include <netdb.h>;
#include <resolv.h>;
#include <sys/wait.h>;
#include <sys/ioctl.h>;
#include <iostream.h>;
#include <string>;

using namespace std;

extern struct __res_state _res;

#include <iostream>;
#include <string>;
using namespace std;

string NameServer;
string DomainName;

int ResolvDns(){
        if( inet_addr(NameServer.c_str()) < 0 )
        {
                cout << "Ip " << NameServer.c_str() << " is invalid" << endl;
                return -1;
        }

        int ret;
        ret = res_init();
        if(ret != 0 )
        {
                perror("init error\n";
                return -1;
        }
        _res.retry = 1;
        _res.nscount = 1;
        _res.nsaddr_list[0].sin_addr.s_addr = inet_addr(NameServer.c_str());

        int aslen = 1024;
        u_char aswr[1024];
        memset(aswr, 0, 1024);
        ret = res_query(DomainName.c_str(), ns_c_in, ns_t_a, aswr, 1024);
        if(ret < 0)
        {
                perror("query error\n";
                return -1;
        }
        if(ret >; 1024)
        {
                perror("answer 2 long error\n";
                return -1;
        }

        ns_msg ns;
        ns_rr rr;

        int iipcount = 0;

        ret = ns_initparse(aswr, ret, &ns);
        iipcount = ns_msg_count(ns, ns_s_an);
        in_addr in;
        for(int mm=0; mm<iipcount; mm++)
        {
                if(ns_parserr(&ns, ns_s_an, mm, &rr) < 0)
                {
                        perror("parse error\n";
                        continue;
                }
                if(ns_rr_type(rr) == ns_t_a)
                {
                        in.s_addr = htonl(ns_get32(ns_rr_rdata(rr)));
                        cout << "ip: " << inet_ntoa(in) <<endl;
                }
        }
        return 0;
}

int main(int argc, char **argv)
{
        struct hostent* server;

        if(argc != 3)
        {
                cout << "Usage : " << endl;
                cout << "        " << argv[0] << " IP DN" << endl;
                cout << "IP    : ip address of nameserver" << endl;
                cout << "DN    : domain name want to be resolved" << endl;
                return -1;
        }

        NameServer = argv[1];
        DomainName = argv[2];
        ResolvDns();
        return 1;
}
以上这段代码我在公司的solaris下运行正常,但是拿到客户那边的solaris下重新编译执行(在没有配置文件/etc/resolv.conf的情况下)却无法解析,但是当配置了/etc/resolv.conf(DNS)后,运行时即使你指定DNS为1.1.1.1也能成功解析。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP