[erlang-questions] Differentiating between FQDN and IP addresses

23 views
Skip to first unread message

Sachin Joshi

unread,
Aug 18, 2017, 10:42:46 AM8/18/17
to erlang-q...@erlang.org
HI Team,

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?

Thanks,
Sachin

zxq9

unread,
Aug 18, 2017, 11:01:33 AM8/18/17
to erlang-q...@erlang.org
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.
http://erlang.org/doc/man/inet.html#parse_strict_address-1

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.

-Craig
_______________________________________________
erlang-questions mailing list
erlang-q...@erlang.org
http://erlang.org/mailman/listinfo/erlang-questions

Reply all
Reply to author
Forward
0 new messages