Не удается подключиться к определенному сетевому интерфейсу

Я прочитал документы для "inet", "gen_tcp", но не могу понять, где ошибка.

connect_option () = {ip, inet: socket_address ()}

socket_address () = ip_address ()

ip_address () = ip4_address () | ip6_address ()

ip6_address () = {0,65535, 0,65535, 0,65535, 0,65535, 0,65535, 0,65535, 0,65535, 0,65535}

таким образом, это должно быть {ip, {0..65535, 0..65535, 0..65535, 0..65535, 0..65535, 0..65535, 0..65535, 0..65535}}

(aaa@127.0.0.1)8> Ip = {65152,0,0,0,51840,11332,54567,49336}.
{65152,0,0,0,51840,11332,54567,49336}
(aaa@127.0.0.1)9> gen_tcp:connect({127,0,0,1}, 6653, [binary, {packet, raw}, {active, false}, {ip, Ip}]).
{error,eafnosupport}
(aaa@127.0.0.1)10> gen_tcp:connect({0,0,0,0,0,0,0,1}, 6653, [binary, {packet, raw}, {active, false}, {ip, Ip}]).
** exception exit: badarg
     in function  gen_tcp:connect/4 (gen_tcp.erl, line 148).

inet:getifaddrs().
{ok,[{"lo",
      [{flags,[up,loopback,running]},
       {hwaddr,[0,0,0,0,0,0]},
       {addr,{127,0,0,1}},
       {netmask,{255,0,0,0}},
       {addr,{0,0,0,0,0,0,0,1}},
       {netmask,{65535,65535,65535,65535,65535,65535,65535,
                 65535}}]},
     {"eth0",
      [{flags,[up,broadcast,running,multicast]},
       {hwaddr,[82,84,0,229,5,188]},
       {addr,{172,17,0,218}},
       {netmask,{255,255,255,128}},
       {broadaddr,{172,17,0,255}},
       {addr,{65152,0,0,0,20564,255,65253,1468}},
       {netmask,{65535,65535,65535,65535,0,0,0,0}}]},
     {"eth1",
      [{flags,[up,broadcast,running,multicast]},
       {hwaddr,[82,84,0,229,5,189]},
       {addr,{65152,0,0,0,51840,11332,54567,49336}},
       {netmask,{65535,65535,65535,65535,0,0,0,0}}]}]}

или же

(aaa@127.0.0.1)9> Op.
[binary,
 {packet,raw},
 {active,false},
 {reuseaddr,true},
 {ip,{65152,0,0,0,51840,11332,54567,49336}}]
(aaa@127.0.0.1)10> gen_tcp:listen(6653, Op).

{Ошибка, EINVAL}

1 ответ

Если вы еще раз проверите документ gen_tcp, вы увидите, что при работе с адресом ipv6 вам необходимо добавить опцию Socket Option inet6, которая отсутствует в вашем коде.

Попробуйте этот код, он должен работать:

Op = [binary, {packet,line}, {active,false}, {reuseaddr,true}, inet6, {ip, {0,0,0,0,0,0,0,1}}].
gen_tcp:listen(8000, Op).
Другие вопросы по тегам