Unix域套接字如何在Erlang 19中工作

For*_*sed 3 erlang

我尝试了几件事,但无法读取任何内容

{ok, Port} = gen_udp:open(0, [{ifaddr,{local,"/tmp/socket2"}}]).
Run Code Online (Sandbox Code Playgroud)

然后我切换到控制台。

echo "hi" |  socat - UNIX-CONNECT:/tmp/socket2
Run Code Online (Sandbox Code Playgroud)

回到埃尔朗

41> gen_udp:recv(Port, 2, 5000).
{error,timeout}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。我也尝试过{active,true} opt和flush()。什么也没显示。

los*_*der 5

我尚未尝试过正式发行版19,但可以通过以下方式使用最新的git(截至7月7日)使其正常工作:

  1. 禁用 {active, false}
  2. 使用UNIX-SENDTO而不是UNIX-CONNECT
  3. 将socat的套接字绑定到其自己的地址(不绑定会在解析地址时在erlang端产生错误。)

示范

控制台1:

$ rm /tmp/socket*
$ erl
Erlang/OTP 19 [erts-8.0.1] [source-ca40008] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.0.1  (abort with ^G)
 1> {ok, Port} = gen_udp:open(0, [{active, false},{ifaddr, {local,"/tmp/socket2"}}]),
 1>         io:format("ok~w ~w~n", [ok,Port]),
 1>         gen_udp:recv(Port, 2).
 okok #Port<0.451>
Run Code Online (Sandbox Code Playgroud)

控制台2:

 $ echo "hi" |  socat - UNIX-SENDTO:/tmp/socket2,bind=/tmp/socket1
Run Code Online (Sandbox Code Playgroud)

控制台1结果:

okok #Port<0.451>
{ok,{{local,<<"/tmp/socket1">>},0,"hi\n"}}
Run Code Online (Sandbox Code Playgroud)