`
litaocheng
  • 浏览: 337710 次
  • 性别: 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 Shell 中输入命令,例如数学运算符号,函数调用等。Erlang Shell 提供了一个交互式的环境,用户可以实时查看输出结果。 2. 顺序编程 顺序编程是 Erlang 编程语言的基础,用户可以使用 Erlang ...

    erlang 中文基础教程

    更复杂的数学运算也能轻松处理,比如`(42+77)*66/3.`,Erlang Shell能够正确解析并执行加、减、乘、除等运算,返回结果`2618.00`。这展示了Erlang语言强大的计算能力。 当需要退出Erlang Shell时,可以通过两种方式...

    Erlang中文手册.pdf

    - **1.3.1 进程**:Erlang的进程与其他语言中的线程类似,但它们是轻量级的,并且通过消息传递进行通信。 - **1.3.2 信息传递**:进程间通信是通过消息传递完成的,Erlang提供了简单的机制来实现这一点。 - **1.3.3 ...

    erlang 中文,chm参考文档

    3. **进程和通信**:深入解析Erlang的并发模型,包括进程的创建、通信方式(如消息传递)以及进程间的同步。 4. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,用于在函数定义中解构复杂的数据结构。 5. **...

    erlang 中文乱码

    在IT行业中,Erlang是一种强大的并发编程语言,主要用于构建高可用性、容错性和分布式系统。当我们在处理中文字符时,特别是在Erlang环境中,可能会遇到“中文乱码”的问题。这个问题通常与字符编码、文件读写以及...

    硝烟中的erlang

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

    erlang 中进程

    在Erlang中,进程是并发执行的基本单元,它们轻量级且独立,彼此通过消息传递进行通信。下面将详细介绍Erlang中的进程以及如何使用它们进行并发开发。 1. 进程概念 在Erlang中,进程不同于操作系统中的线程或进程。...

    <27>erlang record

    标题中的“&lt;27&gt;erlang record”可能指的是Erlang编程语言中的Record特性,它是一种数据结构,类似于结构体或者哈希表,用于组织和操作数据。在Erlang中,Record提供了一种方便的方式来定义和访问具有固定字段的数据...

    erlang文献及资料汇总

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

    erlang编程 Introducing Erlang

    Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...

    Erlang 中的Module级别热部署

    在Erlang编程环境中,模块级别的热部署是一项关键特性,它允许开发者在不中断系统运行的情况下更新或替换已加载的模块。这对于实时系统和高可用性服务尤其重要,因为它们需要持续提供服务而不能因为代码更新而停机。...

    Erlang编程规则——中文翻译版本

    本文将对Erlang编程规则的中文翻译版本中的部分内容进行详细解析,包括Erlang术语、SW工程原则、程序、服务器和消息处理、Erlang特殊约定、常见错误以及所需文档约定等。 Erlang术语部分提到了Erlang程序的模块化...

    erlsom:用于Erlang的XML解析器

    **erlsom:Erlang中的XML解析器** `erlsom` 是一个专为Erlang编程语言设计的XML解析器,它提供了一种高效且灵活的方式来处理XML文档。在Erlang环境中,`erlsom` 主要用于解析XML数据,并将其转换为Erlang的数据结构...

    erlang25.0 windows版本

    3. **环境变量**:安装过程中,安装程序可能会自动添加Erlang的bin目录到系统的PATH环境变量中,确保命令行可以识别`erl`等Erlang命令。 4. **验证**:安装完成后,打开命令行窗口并输入`erl`,如果Erlang成功安装,...

    erlang 部分源码

    源码中可能包含编译器的实现,这有助于理解Erlang语法的解析过程。 通过深入研究这个压缩包中的源代码,开发者可以获得对Erlang语言核心机制的深入理解,这对于优化Erlang代码、调试问题或开发新的Erlang工具都是...

Global site tag (gtag.js) - Google Analytics