`
litaocheng
  • 浏览: 333385 次
  • 性别: 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请求全部成功!
分享到:
评论

相关推荐

    dns_erlang:Erlang DNS库

    dns_erlang 支持大多数常见记录类型...dns_terms.hrl 该文件定义了DNS数据包中使用的各种术语(定义为Erlang宏)。 它包括用于每种DNS类型的术语,其中包括一个术语(用于数值)和一个术语(用于二进制版本)。 例如:

    erlang 中文基础教程

    erlang 中文基础教程erlang 中文基础教程

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    erlang中文基础教程

    erlang中文基础教程

    硝烟中的erlang

    诊断以及调试生产环境中的Erlang 系统。在程序员学习新的语言和环境时,都需要一个摸索 阶段,也就是学会在社团的帮助下,脱离指南,解决实际问题。 本书假设读者精通基本的Erlang和OTP框架。在本书中,会对一些难以...

    erlang文献及资料汇总

    erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 Erlang 程序:陷阱和对策 硝烟中的Erlang 深入底层: erlang VM基于多核处理器的...

    Erlang中文手册.pdf

    Erlang/OTP R11B 文档 Erlang/OTP R11B documentation

    Erlang 中的Module级别热部署

    Erlang 中的Module级别热部署

    Erlang中文手册

    Erlang中文手册

    erlsom:用于Erlang的XML解析器

    erlsom:用于Erlang的XML解析器

    erlang编程 Introducing Erlang

    erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent

    erlang 中文,chm参考文档

    erlang 中文,chm参考文档

    luerl, Erlang中的Lua.zip

    luerl, Erlang中的Lua Luerl - 在Erlang中实现 LuaLuerl是用 erlang/otp编写的标准 Lua 5.2的实现。Lua是游戏。物联网设备。AI机器人。机器学习和科学计算研究中常见的。高效。高效。可以嵌入的脚本。它支持程序化。...

    erlang_版本24.3.4.4

    erlang 安装包

    erlang中文电子书

    erlang中文电子书,是最好的入门用书

Global site tag (gtag.js) - Google Analytics