LibEvent中文帮助文档--第15章【底层DNS接口】



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错误码

错误码

意义

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版本引入。

<<下一章>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值