http://sofia-sip.sourceforge.net/refdocs/sresolv/index.html,翻译自官网的这张网页。
有一个博客系列,对于理解DNS有帮助。http://yuelei.blog.51cto.com/202879/106921
模块信息
Sofia sresolv模块是一个异步DNS解析器,并且支持新的EDNS扩展。<sofia-sip/sresolv.h>头文件中申明了利用su_root_t使用本模块的接口。
另一套接口在<sofia-resolv/sres.h>、<sofia-resolv/sres_record.h>、<sofia-resolv/sres_async.h>和<sofia-resolv/sres_cache.h>等头文件中被定义。
-
联系人:
- Pekka Pessi < Pekka.Pessi@nokia-email.address.hidden>
-
状态:
- Sofia SIP Core library
-
许可:
- LGPL
-
待开发事项:
- 缓存策略和缓存定位
缓存策略必须能够解析那些非授权条目(non-authorized answer简单的理解就是指cache中的answer)。
为何要创建Sofia Resolver?
通常那些开源DNS库要么是同步方式(阻塞了调用线程去做查询),或者它们只能解析主机名。SIP协议除了使用A或AAAA记录(参考:https://www.ezloo.com/2011/04/a_mx_cname_txt_aaaa_ns.html)还使用NAPTR和SRV记录(参考:http://anders.com/cms/264),因此这些DNS库并不完全适合SIP应用。
Sofia resolver使用通常的DNS配置。在类Unix系统下是/etc/resolv.conf文件;在windows系统下是registry注册表。Sofia resolvers在发现配置发生了变化后会重新加载这些配置。
除了配置文件,环境变量SRES_OPTIONS和RES_OPTIONS也可以用来改变解析器的行为。
使用Sofia Resolver
Sofia resolver通常情况下以异步方式运行。即,生成一个请求,发送给DNS服务器,并且立即返回给调用者。当响应收到后请求即结束,sresolv通过一个回调函数通知应用程序。
应用程序可在解析器使用的文件描述符上显式使用poll或select然后调用底层的函数,或者使用su_root(一个指向su_root_t对象的指针)。第三种方式是同步使用解析器:sres_blocking_query()。
sresolv内部使用了一个缓存。查询函数将记录存入缓存。使用缓存就像是直接从DNS服务器得到的结果一样。
请注意,必须为每个线程创建各自独立的解析器对象。但所有的解析器将共享这个缓存。
<sofia-sip/sresolv.h>头文件中的接口
<sofia-sip/sresolv.h>头文件中定义了由su_root驱动的Sofia resolver,这种方式的使用非常简单。创建函数中提供的root对象会安排调用sres_query()和sres_query_sockaddr()函数中的回调函数。
#include <sofia-sip/sresolv.h> sres_resolver_t *sres_resolver_create(