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

unix域套接字如何在Erlang 19中工作,erlang,Erlang,我试过一些东西,但我什么也看不懂 {ok, Port} = gen_udp:open(0, [{ifaddr,{local,"/tmp/socket2"}}]). 然后我切换到控制台 echo "hi" | socat - UNIX-CONNECT:/tmp/socket2 回到二郎 41> gen_udp:recv(Port, 2, 5000). {error,timeout} 感谢您的帮助。我还尝试了{active,true}opt和flush()。没有显示任何内容。我没有尝试

我试过一些东西,但我什么也看不懂

{ok, Port} = gen_udp:open(0, [{ifaddr,{local,"/tmp/socket2"}}]).
然后我切换到控制台

echo "hi" |  socat - UNIX-CONNECT:/tmp/socket2
回到二郎

41> gen_udp:recv(Port, 2, 5000).
{error,timeout}

感谢您的帮助。我还尝试了{active,true}opt和flush()。没有显示任何内容。

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

  • 使用
    {active,false}
  • 使用UNIX-SENDTO而不是UNIX-CONNECT
  • 将socat的套接字绑定到它自己的地址(不绑定会在解析地址时在erlangs端产生错误。)
  • 演示

    控制台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>
    
    控制台1结果:

    okok #Port<0.451>
    {ok,{{local,<<"/tmp/socket1">>},0,"hi\n"}}
    
    ok#端口
    {ok,{local,},0,“hi\n”}
    
    第一个命令是否执行?这似乎是不可能的:。对此()有一些讨论和补丁,但显然您必须在Erlang之外或使用NIF创建unix套接字。根据最新的发行说明,这是一个新事物。啊!我没有意识到这一变化。变更日志中有提到吗?无论如何,我会仔细看看。
    okok #Port<0.451>
    {ok,{{local,<<"/tmp/socket1">>},0,"hi\n"}}