使用“inet_res”库的 Elixir 错误

Elixir errors using `inet_res` library

我在使用 Erlang 的 inet_res 时遇到了一些问题。我尝试在我的 Elixir shell 和我的 Erlang shell 中使用它,但我有意想不到的行为。有时我能够查找域,有时我没有 return 值:

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'}]

如您所见,我调用它的前两次 return 生成了一个空数组,第三次 return 生成了良好的值。

我尝试添加第 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.

上也有同样的失败

编辑2: copy-paste 来自我在 Slack(Elixir 团队)上的一次讨论

troush [8:45 PM] 它在我的域中运行良好。也许这个问题特定于域?

kdisneur [晚上 8:47] 你试过几次了吗?我的意思是杀了你 session 并重试,因为有时有效,有时无效。

胡思乱想 [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'}]

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

kdisneur [8:56 PM] 是的,当你在 session 中并且它工作一次时,我得到的结果与你相同。这就是为什么我要问关于重新启动一个新的 Elixir shell

troush [8:59 PM]哦,好的,我明白了。是的,我在广泛的新 iex session 上遇到了这个问题。空响应,但仅限于您的域。在 gmail/google.com 上它工作得很好

troush [9:01] 我的自定义域也遇到了同样的问题。所以这里有一些问题:simple_smile:对不起,不和谐

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

感谢您的帮助

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

至'fast-track':

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'}]