libevent 在 Android 上的一个改进

本文探讨了在Android上使用libevent进行异步DNS解析时遇到的问题——libevent无法从系统获取DNS服务器。通过分析源码,发现在Android(没有resolv.conf文件)上,libevent的初始化存在问题。解决方案是在编译时为libevent添加ANDROID宏,并实现针对Android平台读取DNS配置的代码。参考《Android C 语言读取系统属性》一文,可以解决此问题。
摘要由CSDN通过智能技术生成

    想在 Android 上使用 libevent 做一个下载程序,牵涉到域名解析的问题,发现 libevent 无法获取到 dns 服务器。研究了一下源码,找到了问题所在。

    使用 libevent 的异步 dns 解析的一般过程如下:

  1. 调用 evdns_base_new(struct event_base *event_base, int initialize_nameservers) 生成一个 evdns_base 对象
  2. 调用 evdns_getaddrinfo 并提供一个回调进行解析
  3. 在回调中处理结果

    一般我们给 evdns_base_new 函数的第二个参数传递 1 以便 libevent 从系统配置中初始化 nameservers 。在 windows 上读取注册表,在 Linux 上读取 /etc/resolv.conf 。问题就出在这里,Android 上没有 resolv.conf 文件而 libevent 未做处理。查看 evdns.c 文件中的 evdns_base_new 函数实现可知:

struct evdns_base *
evdns_base_new(struct event_base *event_base, int initialize_nameservers)
{
	struct evdns_base *base;

	if (evutil_secure_rng_init() < 0) {
		log(EVDNS_LOG_WARN, "Unable to seed random number generator; "
		    "DNS can't run.");
		return NULL;
	}

	/* Give the evutil library a hook into its evdns-enabled
	 * functio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值