`
litaocheng
  • 浏览: 339800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang中dns解析

阅读更多
因为ecrawler,需要具有DNS解析功能,看文章都介绍说,要注意系统提供的gethostbyname之类的函数内部实现机制,是采用顺序执行,还是启动多个连接并发执行?

我在erlang中做了一下测试(windows2003 + R12B-3):

1,首先清空本地的dns信息(cmd中 ipconfig /flushdns)
2,多个process同时调用inet:getaddr/2请求dns地址
3,wireshark抓包,发现同时只有4个DNS(port 53)的请求,4个dns请求成功后,第一个又进行了一次请求,结果我的只有5个请求解析成功,其他的都是{error, timeout}

如此看来erlang的inet:getaddr/2 只是开启有限数目的连接,所后进行dns解析请求,至于后面多余的请求,只能超时了。是不是getaddr应该提供更多的选项?

下面是测试结果:

%% 请求
<0.258.0> start:{1221,193358,78000} Host:"www.toquick.com"
<0.259.0> start:{1221,193358,78001} Host:"www.ubuntu.org"
<0.260.0> start:{1221,193358,78002} Host:"www.china.com"
<0.261.0> start:{1221,193358,78003} Host:"www.tom.com"
<0.262.0> start:{1221,193358,78004} Host:"www.sohu.com"
<0.263.0> start:{1221,193358,78005} Host:"www.msn.com"
<0.264.0> start:{1221,193358,78006} Host:"www.answers.com"
<0.265.0> start:{1221,193358,78007} Host:"www.tudou.com"
<0.266.0> start:{1221,193358,78008} Host:"www.erlang.org"
<0.267.0> start:{1221,193358,78009} Host:"www.howcast.com"
<0.268.0> start:{1221,193358,78010} Host:"www.go2map.com"
<0.269.0> start:{1221,193358,78011} Host:"www.microsoft.com"
%% response
<0.259.0> end:{1221,193358,78012} Value:{ok,{147,83,195,55}}
<0.260.0> end:{1221,193358,78013} Value:{ok,{221,194,139,22}}
<0.258.0> end:{1221,193358,78014} Value:{ok,{211,136,108,240}}
<0.261.0> end:{1221,193358,78015} Value:{ok,{202,108,12,68}}
<0.262.0> end:{1221,193358,78016} Value:{ok,{61,135,189,165}}
<0.269.0> end:{1221,193366,93000} Value:{error,timeout}
<0.268.0> end:{1221,193366,93001} Value:{error,timeout}
<0.267.0> end:{1221,193366,93002} Value:{error,timeout}
<0.266.0> end:{1221,193366,93003} Value:{error,timeout}
<0.265.0> end:{1221,193366,93004} Value:{error,timeout}
<0.264.0> end:{1221,193366,93005} Value:{error,timeout}
<0.263.0> end:{1221,193366,93006} Value:{error,timeout}


接着感谢yufeng的帮助!

Erlang中提供native以及erlang dns请求,两种方式进行dns解析。其中native方式下,通过port调用外部应用实现,外部应用调用系统本身的dns相关API,如 gethostbyname等;erlang自身也实现了dns的请求解析,并拥有一套缓存,管理机制。
我们可以参考:ERTS User's Guide 的inet configuration 进行配置。
erlang默认采用native方式进行dns解析,默认的并发数目为4,所以出现了本文中的问题,多个dns解析请求,只有前4个成功,其他均超时。我们可以通过设置变量:gethost_poolsize来增大并发数(请注意,每增大1,则外部应用新创建一个线程):
erl -kernel gethost_poolsize 12
我们启动erlang,设置并发请求数为12,随后运行testdns:dns()所有请求均可成功。

面对大量并发的dns请求,显然采用native方式不可行,因此我们采用erlang自身的dns请求,我们通过创建配置文件(erl_inetrc):

%erl_inetrc
%% specify lookup method
{lookup, [dns]}.
%% timeout
{timeout, 5000}.
{nameserver, {202, 106, 46, 151}, 53}.


随后启动erl:
erl -kernel inetrc './erl_inetrc'


运行:
testdns:dns()


发现12个dns请求全部成功!
分享到:
评论

相关推荐

    Erlang的高级特性和应用

    节点间的通信高效、安全,通过epmd实现类似DNS的名称解析。OTP(Open Telecom Platform)提供了诸如gen_server这样的行为模式,简化了分布式系统中的位置透明性和容错机制。 **Mnesia 分布数据库** Mnesia 是Erlang...

    mdns:适用于Erlang的更通用的mDNS,Zeroconf,Avahi客户端服务器

    综上所述,`mdns`库为Erlang开发者提供了一套完整的mDNS解决方案,帮助他们在无中心DNS服务器的环境中实现服务的自动发现和通信,这对于构建现代物联网和分布式系统具有重要意义。通过深入理解和使用`mdns-master`,...

    Centos下安装RabbitMQ

    DNS服务是用于域名解析的,如果没有安装DNS服务,在执行某些命令时,例如ping命令,可能会因为域名无法解析而失败。因此,可以使用ping命令测试DNS服务是否工作正常,比如尝试***。如果返回了正确的数据,则说明DNS...

    fasterapple:中国大陆 DNS 服务的 BIND 数据库,加快 Apple App Store 的速度。 苹果在中国大陆设立App Store镜像后不经常更新

    您可以将 DNS 设置设置为42.121.236.241 、 74.117.62.158以直接使用该服务。 配置文件的测试版本将在,服务器正在使用的稳定版本将在操作说明FasterApple 项目使用的所有 BIND9 配置文件都在 db 目录中。 您可以...

    超级课程表的技术选型

    - **DNS解析优化**:为了解决国内跨网DNS劫持问题,采用了预埋客户端多IP+域名解析的方式,或使用HTTP DNS替代传统DNS协议。 #### JVM调优 - **线程池模型**:合理配置线程池大小,避免过多线程造成资源浪费。 - *...

    xmpp 内部文档

    配置文件包括c2s.xml(客户端到服务器)、s2s.xml(服务器到服务器)、sm.xml(会话管理)、resolver.xml(DNS解析器)和router.xml。 客户端连接方面,例如Psi,用户需要启动服务器,然后在客户端设置中指定服务器...

    通信技术概论

    从华为内部培训资料中,我们可以深入理解通信技术的核心概念和技术体系,以下是对该资料中提及的关键知识点的详细解析。 ### 1. 信号与通信系统 #### 1.1 信息和信号 - **信息量**:衡量信息量的单位通常是比特...

Global site tag (gtag.js) - Google Analytics