erlang的DNS解析,有个inet模块,可以做这个事情,对应的api如下:(这里用的R16B的版本)
inet:getaddr/2解析对应一个ip,而inet:getaddr/2解析有可能对应1个或多个映射的IP. 第一个参数为host域名,第二个参数是ipv4或ipv6.
如下图:
下面是按照IPv4的情况走的流程,在mochiweb中,在mochiweb_socket_server模块中有对IPV6做的判断,如下:
ipv6_supported() -> case (catch inet:getaddr("localhost", inet6)) of {ok, _Addr} -> true; {error, _} -> false end.
简单写了下测试代码,直接上代码:
enter() -> [ resolve(Host) || Host <- domains()]. %%域名列表 domains() -> ["www.baidu.com","www.china.com", "www.sohu.com","www.msn.com"]. resolve(Host) -> %%DNS解析,通过域名解析对应一个IP值 IP = case inet:getaddr(Host,inet) of {ok,{IP1,IP2,IP3,IP4}} -> combin_ip(IP1,IP2,IP3,IP4); {error, Reason} -> throw(Reason) end, inets:start(), httpc:request(IP). %%拼接IP combin_ip(IP1,IP2,IP3,IP4) -> "http://" ++ integer_to_list(IP1) ++ "." ++ integer_to_list(IP2) ++ "." ++ integer_to_list(IP3) ++ "." ++ integer_to_list(IP4).
运行结果如下:
做了多个域名的解析,解析成IP后,再用erlang内部封装的inets模块(轻量级http的框架),去分别做http的请求.