使用`inet_res`库

时间:2015-11-19 18:41:11

标签: erlang elixir

我在Erlang的inet_res遇到了一些麻烦。我试图从我的Elixir shell和我的Erlang shell中使用它,但我有意想不到的行为。有时候我可以查找域名,有时候我没有返回值:

iex(1)> :inet_res.lookup('disneur.me', :in, :mx)
[]
iex(2)> :inet_res.lookup('disneur.me', :in, :mx)
[]
iex(3)> :inet_res.lookup('disneur.me', :in, :mx)
[{1, 'aspmx.l.google.com'}, {10, 'alt3.aspmx.l.google.com'},
 {10, 'alt4.aspmx.l.google.com'}, {5, 'alt1.aspmx.l.google.com'},
 {5, 'alt2.aspmx.l.google.com'}]

正如你可以看到前两次我调用它,它返回一个空数组和第三个时间,它返回了良好的值。

我尝试添加第4个参数retry: 5timeout: 10,但它没有帮助:

:inet_res.lookup('disneur.me', :in, :mx, timeout: 10, retry: 5)
[]
iex(2)> :inet_res.lookup('disneur.me', :in, :mx, timeout: 10, retry: 5)
[{1, 'aspmx.l.google.com'}, {10, 'alt3.aspmx.l.google.com'},
 {10, 'alt4.aspmx.l.google.com'}, {5, 'alt1.aspmx.l.google.com'},
 {5, 'alt2.aspmx.l.google.com'}]

我也直接从erlang shell尝试过,我的行为完全相同:

1> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]).
[]
2> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]).
[]
3> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]).
[]
4> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]).
[{1,"aspmx.l.google.com"},
 {10,"alt3.aspmx.l.google.com"},
 {10,"alt4.aspmx.l.google.com"},
 {5,"alt1.aspmx.l.google.com"},
 {5,"alt2.aspmx.l.google.com"}]

你知道为什么我有这种不可预知的行为吗?我是否以错误的方式使用此库?

编辑: 有关信息,我试过其他域名(即:gmail.com),我有同样的问题。其他人也在他们自己的计算机上和不同的位置尝试了这个代码。我对Circle-CI也有同样的失败。

EDIT2: 我在Slack(Elixir团队)讨论中的复制粘贴

麻烦[8:45 PM] 我的域名正常运行。也许这个问题属于域名?

kdisneur [8:47 PM] 你试了几次吗?我的意思是杀死你的会话并重试,因为有时它会起作用,有时却不会。

故障[8:54 PM]

iex(35)> :inet_res.lookup('google.com', :in, :mx)
[{30, 'alt2.aspmx.l.google.com'}, {40, 'alt3.aspmx.l.google.com'},
 {50, 'alt4.aspmx.l.google.com'}, {10, 'aspmx.l.google.com'},
 {20, 'alt1.aspmx.l.google.com'}]
iex(36)> :inet_res.lookup('google.com', :in, :mx)
[{40, 'alt3.aspmx.l.google.com'}, {50, 'alt4.aspmx.l.google.com'},
 {10, 'aspmx.l.google.com'}, {20, 'alt1.aspmx.l.google.com'},
 {30, 'alt2.aspmx.l.google.com'}]
iex(37)> :inet_res.lookup('google.com', :in, :mx)
[{50, 'alt4.aspmx.l.google.com'}, {10, 'aspmx.l.google.com'},
 {20, 'alt1.aspmx.l.google.com'}, {30, 'alt2.aspmx.l.google.com'},
 {40, 'alt3.aspmx.l.google.com'}]

故障[8:55 PM] 可能是连接问题。

kdisneur [8:56 PM] 是的,当你在一个会话中并且它工作一次时,我的结果与你相同。这就是我要求重新启动一个新的Elixir shell的原因

麻烦[8:59 PM] 哦,好吧,我明白了。是的,我在广泛的新iex会议上得到了这个问题。空响应,但仅限于您的域。在gmail / google.com上,它可以正常工作

麻烦[9:01] 我在自定义域名上遇到了同样的问题。所以有一些问题:simple_smile:对不起道歉

所以我不认为它来自我的网络或特定域。我认为这与我使用这个库的方式有关。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

这是一场竞争条件。您从尚未存在的内容中请求数据。在VM初始化时,inet_db需要获取解析器列表。您在该过程完成之前进行该查询。

快速跟踪':

iex(1)>  :inet_db.add_ns({4,2,2,1}) ; :inet_res.lookup('disneur.me', :in, :mx)
[{10, 'alt3.aspmx.l.google.com'}, {10, 'alt4.aspmx.l.google.com'},
{5, 'alt1.aspmx.l.google.com'}, {5, 'alt2.aspmx.l.google.com'},
{1, 'aspmx.l.google.com'}]