LibEvent中文帮助文档--第15章【底层DNS接口】
Libevent
快速可移植非阻塞式网络编程
修订历史
版本
日期
作者
备注
V1.0
2016-11-15
周勇
Libevent编程中文帮助文档
文档是2009-2012年由Nick-Mathewson基于Attribution-Noncommercial-Share Alike许可协议3.0创建,未来版本将会使用约束性更低的许可来创建.
此外,本文档的源代码示例也是基于BSD的"3条款"或"修改"条款.详情请参考BSD文件全部条款.本文档最新下载地址:
英文:http://libevent.org/
中文:http://blog.csdn.net/zhouyongku/article/details/53431750
请下载并运行"gitclonegit://github.com/nmathewson/libevent- book.git"获取本文档描述的最新版本源码.
15.底层DNS接口
有时候需要启动能够比从 evdns_getaddrinfo()获取的DNS 请求进行更精细控制的特别的DNS请求,libevent也为此提供了接口。
缺少的特征:当前libevent 的DNS 支持缺少其他底层DNS 系统所具有的一些特征,如支持任意请求类型和TCP 请求。如果需要evdns 所不具有的特征,欢迎贡献一个补丁。也可以看看其他全特征的DNS 库,如c-ares。
接口
#define DNS_QUERY_NO_SEARCH /* ...*/
#define DNS_IPv4_A /* ...*/
#define DNS_PTR /* ...*/
#define DNS_IPv6_AAAA /* ...*/
typedef void ( * evdns_callback_type)(int result, char type, int count,
int ttl,
void* addresses,
void * arg);
struct evdns_request* evdns_base_resolve_ipv4(struct evdns_base * base,
const char* name,
int flags,
evdns_callback_type callback,
void * ptr);
struct evdns_request* evdns_base_resolve_ipv6(struct evdns_base * base,
const char* name,
int flags,
evdns_callback_type callback,
void * ptr);
struct evdns_request* evdns_base_resolve_reverse(struct evdns_base * base,
const struct in_addr* in,
int flags,
evdns_callback_type callback,
void* ptr);
struct evdns_request* evdns_base_resolve_reverse_ipv6(
struct evdns_base* base,
const struct in6_addr * in,
int flags,
evdns_callback_type callback,
void* ptr);
这些解析函数为一个特别的记录发起 DNS请求。每个函数要求一个 evdns_base用于发起请求、一个要查询的资源(正向查询时的主机名,或者反向查询时的地址) 、一组用以确定如何进行查询的标志、 一个查询完成时调用的回调函数, 以及一个用户提供的传给回调函数的指针。
flags参数可以是0,也可以用DNS_QUERY_NO_SEARCH 明确禁止原始查询失败时在搜索列表中进行搜索DNS_QUERY_NO_SEARCH对反向查询无效,因为反向查询不进行搜索。
请求完成(不论是否成功) 时回调函数会被调用。回调函数的参数是指示成功或者错误码 (参看下面的 DNS 错误表)的 result、一个记录类型(DNS_IPv4_A、DNS_IPv6_AAAA,或者DNS_PTR) 、addresses中的记录数、以秒为单位的存活时间、地址(查询结果) ,以及用户提供的指针。
发生错误时传给回调函数的 addresses参数为 NULL。没有错误时:对于PTR 记录,addresses是空字符结束的字符串;对于 IPv4记录,则是网络字节序的四字节地址值数组 ;对于IPv6记录,则是网络字节序的16字节记录数组。 (注意:即使没有错误,addresses的个数也可能是0。名字存在,但是没有请求类型的记录时就会出现这种情况)
可能传递给回调函数的错误码如下:
错误码 | 意义 |
DNS_ERR_NONE | 没有错误 |
DNS_ERR_FORMAT | 服务器不识别查询请求 |
DNS_ERR_SERVERFAILED | 服务器内部错误 |
DNS_ERR_NOTEXIST | 没有给定名字的记录 |
DNS_ERR_NOTIMPL | 服务器不识别这种类型的查询 |
DNS_ERR_REFUSED | 因为策略设置,服务器拒绝查询 |
DNS_ERR_TRUNCATED | DNS记录不适合 UDP 分组 |
DNS_ERR_UNKNOWN | 未知的内部错误 |
DNS_ERR_TIMEOUT | 等待超时 |
DNS_ERR_SHUTDOWN | 用户请求关闭evdns 系统 |
DNS_ERR_CANCEL | 用户请求取消查询 |
可以用下述函数将错误码转换成错误描述字符串:
接口
const char* evdns_err_to_string(int err);
每个解析函数都返回不透明的 evdns_request结构体指针。回调函数被调用前的任何时候都可以用这个指针来取消请求:
接口
void evdns_cancel_request(struct evdns_base* base,struct evdns_request* req);
用这个函数取消请求将使得回调函数被调用,带有错误码 DNS_ERR_CANCEL。
15.1挂起DNS客户端操作,更换名字服务器
有时候需要重新配置或者关闭 DNS子系统,但不能影响进行中的 DNS请求。
接口
int evdns_base_clear_nameservers_and_suspend(struct evdns_base* base);
int evdns_base_resume(struct evdns_base* base);
evdns_base_clear_nameservers_and_suspend()会移除所有名字服务器,但未决的请求会被保留,直到随后重新添加名字服务器,调用evdns_base_resume()。
这些函数成功时返回0,失败时返回-1。它们在2.0.1-alpha版本引入。