gloox中SRV lookup方式调用

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 =c
ac_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_gnu
LIBS = "$PTHREAD_LIBS $LIBS"
CPPFLAGS = "$CPPFLAGS $PTHREAD_CFLAGS"
LDFLAGS = "$LDFLAGS $PTHREAD_CFLAGS"
for ac_func in res_querydomain
do :
  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
_ACEOF
fi
done

虽然搞不太懂,但是可以看到里面的

#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。总的来说今天的事情算是大功告成。

你可能感兴趣的:(gloox中SRV lookup方式调用)