我在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: 5
和timeout: 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:对不起道歉
所以我不认为它来自我的网络或特定域。我认为这与我使用这个库的方式有关。
感谢您的帮助
答案 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'}]