[erlang-questions] IPv6

Per Hedeland <>
Mon Mar 30 14:19:20 CEST 2009


Per Hedeland <> wrote:
>
>Is there some good reason for gen_tcp/gen_udp not auto-recognizing an
>8-tuple as an IPv6 address?

And if there isn't, perhaps the trivial patches below could be
considered for inclusion?

--Per

--- otp_src_R13A/lib/kernel/src/gen_tcp.erl.ORIG	2009-03-12 13:19:00.000000000 +0100
+++ otp_src_R13A/lib/kernel/src/gen_tcp.erl	2009-03-27 17:59:12.000000000 +0100
@@ -46,7 +46,7 @@
     end.
 
 connect1(Address,Port,Opts,Timer) ->
-    Mod = mod(Opts),
+    Mod = mod(Opts ++ [{ip, Address}]),
     case Mod:getaddrs(Address,Timer) of
 	{ok,IPs} ->
 	    case Mod:getserv(Port) of
@@ -179,13 +179,17 @@
 %% Get the tcp_module
 mod() -> inet_db:tcp_module().
 
-%% Get the tcp_module, but option tcp_module|inet|inet6 overrides
+%% Get the tcp_module, but option tcp_module|inet|inet6|{ip,tuple()} overrides
 mod([{tcp_module,Mod}|_]) ->
     Mod;
 mod([inet|_]) ->
     inet_tcp;
 mod([inet6|_]) ->
     inet6_tcp;
+mod([{ip, {_,_,_,_}}|_]) ->
+    inet_tcp;
+mod([{ip, {_,_,_,_,_,_,_,_}}|_]) ->
+    inet6_tcp;
 mod([_|Opts]) ->
     mod(Opts);
 mod([]) ->
--- otp_src_R13A/lib/kernel/src/gen_udp.erl.ORIG	2009-03-12 13:19:00.000000000 +0100
+++ otp_src_R13A/lib/kernel/src/gen_udp.erl	2009-03-27 18:05:02.000000000 +0100
@@ -104,13 +104,17 @@
 %% Get the udp_module
 mod() -> inet_db:udp_module().
 
-%% Get the udp_module, but option udp_module|inet|inet6 overrides
+%% Get the udp_module, but option tcp_module|inet|inet6|{ip,tuple()} overrides
 mod([{udp_module,Mod}|_]) ->
     Mod;
 mod([inet|_]) ->
     inet_udp;
 mod([inet6|_]) ->
     inet6_udp;
+mod([{ip, {_,_,_,_}}|_]) ->
+    inet_udp;
+mod([{ip, {_,_,_,_,_,_,_,_}}|_]) ->
+    inet6_udp;
 mod([_|Opts]) ->
     mod(Opts);
 mod([]) ->



Original message----------------------------------------------------
>From: Per Hedeland <>
>To: 
>Subject: [erlang-questions] IPv6
>
>Hi,
>
>Is there some good reason for gen_tcp/gen_udp not auto-recognizing an
>8-tuple as an IPv6 address? gen_tcp:listen/2 and gen_udp:open/2 don't
>even fail if you give them one w/o explicit 'inet6' option, but (OS
>stack permitting) interprets "the first 4 bytes" as an IPv4 address -
>shocking behaviour for an Erlang module!
>
>Erlang R13A (erts-5.7) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]
>Eshell V5.7  (abort with ^G)
>1> gen_tcp:listen(1234, [{ip,{1,43981,4660,0,0,0,0,5}}]).
>{ok,#Port<0.439>}
>2> gen_udp:open(1234, [{ip,{1,43981,4660,0,0,0,0,5}}]).  
>{ok,#Port<0.449>}
>
>$ netstat -an | grep 1234
>tcp        0      0 0.1.171.205:1234            0.0.0.0:*       LISTEN
>udp        0      0 0.1.171.205:1234            0.0.0.0:*  
>
>'inet' may be a reasonable default (though it isn't actually documented
>as such as far as I can see), but blindly "applying" it in the face of
>obvious evidence to the contrary can't be right. gen_tcp:connect/3 and
>gen_udp:send/4 also have "interesting" behaviour:
>
>4> gen_tcp:connect({1,43981,4660,0,0,0,0,5}, 1234, []).
>{error,nxdomain}
>5> gen_udp:send(S, {1,43981,4660,0,0,0,0,5}, 1234, <<"hello">>).
>{error,nxdomain}
>
>Yeah, I can imagine that the name server had trouble finding that
>"domain"... (no, it didn't actually try a DNS lookup).
>
>--Per Hedeland
>_______________________________________________
>erlang-questions mailing list
>
>http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list