gloox提供了srv record的解析,根据srv record解析,我们可以获得 server address 和 端口号,DNS server通过这种协议实现负载均衡之类的功能。
_xmpp-client._tcp.example.com
http://camaya.net/api/gloox-1.0/dns_8cpp-source.html
第一种:
gloox库在变编译的时候可以选择 ./configure --enable-getaddrinfo 来支持resolve srv的功能:
void DNS::resolve( struct addrinfo** res, const std::string& service, const std::string& proto, 00222 const std::string& domain, const LogSink& logInstance )
然而这个函数获得的 addrinfo结构体如果要解析出域名与端口的话可能需要花点心思。我的问题时alignment trap。这种方法暂且跳过。
第二种:
需要打开下面的几个宏,否则调用的resolve函数就是直接返回。根本不会做任何有意义的事情。
问题时怎么打开这几个宏???
#if defined( HAVE_RES_QUERYDOMAIN ) && defined( HAVE_DN_SKIPNAME ) && defined( HAVE_RES_QUERY ) 00081 DNS::HostMap DNS::resolve( const std::string& service, const std::string& proto, 00082 const std::string& domain, const LogSink& logInstance )
查了下configure,发现其中有关于这几个宏的定义
ac_ext =cac_cpp = '$CPP $CPPFLAGS'ac_compile = '$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'ac_link = '$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'ac_compiler_gnu = $ac_cv_c_compiler_gnuLIBS = "$PTHREAD_LIBS $LIBS"CPPFLAGS = "$CPPFLAGS $PTHREAD_CFLAGS"LDFLAGS = "$LDFLAGS $PTHREAD_CFLAGS"for ac_func in res_querydomaindo :ac_fn_c_check_func "$LINENO" "res_querydomain" "ac_cv_func_res_querydomain"if test "x$ac_cv_func_res_querydomain" = xyes; then :cat >>confdefs.h <<_ACEOF#define HAVE_RES_QUERYDOMAIN 1_ACEOFfidone
虽然搞不太懂,但是可以看到里面的
#define HAVE_RES_QUERYDOMAIN 1
这个宏定义,不懂其原理,连解决都不知道怎么下手,总之是要先检查系统中是否支持这个res_querydomain这个函数吧。
大家有没有知道的,告诉小弟一声啊。很急的。。。
2012-12-19 23:07
今天分析了下config.log 看到了里面的 checking res_querydomain no
其中还有-lresolv的问题。
查了下-lresolv在交叉编译工具链中提供了,grep res_query发现也有这个函数,但是貌似gloox检查的时候没有找到这个函数,这个是configure的问题呢?还是我们的交叉工具链的lib的问题呢?
我通过写了一个小程序调用res_query,发现可以正常运行,并且测试结果同x86的相同,难道真的是configure出了问题?那我就惨了,完全没有思路,只能硬着头皮搞之前的那个第一种方案试试了。
看到有libidn 库,就搞过来了,看到里面的getaddrinfo这个函数的拓展之类的,觉得可能会有点帮助吧,但是编译--with-libidn=path-of-libidn --enable-getaddrinfo之后还是会出现所用函数为定义的现象,这是一个值得深思的问题!!!
来说说libidn看似其就是用来支持解析DNS SRV的,可是怎么用呢?
这是一个值得深思的问题,好久没给一个问题搞得这么头疼了。
------------------------------------------------------------------------
经过三天的折腾,发发现了问题所在,我每次修改的事lib,但是编的事app,lib并没有更新,所以不会游泳,现在把lib重编后,就ok了,使用res_querydomain函数,不过其中的map容器的限制需要修改为multimap。总的来说今天的事情算是大功告成。