[erlang-questions] Differentiating between FQDN and IP addresses

zxq9 zxq9@REDACTED
Fri Aug 18 17:00:38 CEST 2017

On 2017年08月18日 金曜日 20:00:24 Sachin Joshi wrote:
> I am getting an input  in a program as 'ip address' or 'FQDN'. I need to
> identify if it is an ipv4 or ipv6 or a hostname(fqdn).
> Can someone help me in this?

Hi, Sachin.

I'm assuming you are receiving these as strings.

The function inet:parse_strict_address/1 can help you determine if the string is a valid IPv4, IPv6, or invalid IP address.

If it is an invalid IP address, then attempt to use it as a FQDN instead. If that fails, then perhaps it is invalid in general.

As for "what is a valid FQDN?" the standard has slid a lot in recent years, so it seems more common to just try it out (perhaps converting a utf-8 string via punycode first to see if that fails) and see if it barfs or not.

Imagine something along the lines of...

> -spec interpret_address(string()) -> Result
>    when Result :: {ipv4, inet:ipv4_address()}
>                 | {ipv6, inet:ipv6_address()}
>                 | {fqdn, inet:hostname()}.
> interpret_address(String) ->
>     case inet:parse_strict_address(String) of
>         {A, B, C, D} ->
>             {ipv4, {A, B, C, D}};
>         {A, B, C, D, E, F, G, H} ->
>             {ipv6, {A, B, C, D, E, F, G, H}};
>         {error, einval} ->
>             {fqdn, String}
>     end.

With the exception that the result on {error, einval} should really look like:

> {error, einval} ->
>     validate_fqdn(String)

and the overall function should be allowed to return the type

> Result :: {ipv4, inet:ipv4_address()}
>         | {ipv6, inet:ipv6_address()}
>         | {fqdn, inet:hostname()}
>         | {error, bad_address}.

But you can get the effect of this by just trying the return value of {fqdn, String} and see if it can actually resolve a hostname this way.

Or something like that.

Forgive my imprecision -- it is very late here. Hopefully this points you in the right direction.


More information about the erlang-questions mailing list