如何在Erlang/Elixir中获取完全限定域名(或仅域名)?
获取Erlang中的域名
你已经知道用:inet.gethostname/0拿到主机名了,那要获取域名的话,咱们可以借助Erlang的:inet模块里的其他函数来实现,下面给你两种常用的方法:
方法一:通过主机名正向解析完整域名
先获取主机名,再用:inet.gethostbyname/1查询该主机的完整信息,从返回的hostent结构体中提取包含域名的完整主机名:
iex(1)> {:ok, hostname} = :inet.gethostname() {:ok, 'Michaels-MacBook-Pro'} iex(2)> {:ok, host_info} = :inet.gethostbyname(hostname) iex(3)> host_info#hostent.h_name 'Michaels-MacBook-Pro.local'
这里的h_name字段返回的是官方完整主机名,包含了域名部分(比如示例中的.local)。如果只需要单独的域名,你可以对这个结果做字符串分割处理,去掉前面的主机名部分。
方法二:通过IP反向解析获取域名
先把主机名转换成IP地址,再通过:inet.gethostbyaddr/1反向解析得到完整主机名:
iex(1)> {:ok, hostname} = :inet.gethostname() {:ok, 'Michaels-MacBook-Pro'} iex(2)> {:ok, ip_addr} = :inet.getaddr(hostname, :inet) {:ok, {192, 168, 1, 100}} iex(3)> {:ok, {full_hostname, _}} = :inet.gethostbyaddr(ip_addr) {:ok, {'Michaels-MacBook-Pro.local', [], [{192, 168, 1, 100}]}} iex(4)> full_hostname 'Michaels-MacBook-Pro.local'
这种方法依赖于系统的反向DNS配置,如果你的主机没有正确配置反向解析,可能会返回失败或者不完整的结果。
小技巧:单独提取域名部分
如果只需要纯域名,可以用:string:tokens/2对完整主机名进行分割:
iex(5)> :string:tokens(host_info#hostent.h_name, '.') ['Michaels-MacBook-Pro', 'local']
取列表的第二个元素就是你要的域名啦~
注意事项
这两种方法都依赖于系统的DNS或本地主机配置(比如/etc/hosts文件),如果配置不正确,可能无法获取到预期的域名。
内容的提问来源于stack exchange,提问作者mconigliaro
相关产品推荐
相关产品推荐

