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

时间:2016-07-07 15:23:08

标签: erlang

我尝试过一些东西,但我无法从中读取任何内容

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

然后我切换到控制台。

echo "hi" |  socat - UNIX-CONNECT:/tmp/socket2

返回erlang

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

感谢任何帮助。我还试过{active,true} opt和flush()。没有任何表现。

1 个答案:

答案 0 :(得分:5)

我没有尝试正式版本19,但我可以使用最新g​​it (截至7月7日)通过以下方式使用它:

  1. 使用{active, false}
  2. 停用活动状态
  3. 使用UNIX-SENDTO而不是UNIX-CONNECT
  4. 将socat的套接字绑定到自己的地址(在解析地址时,不绑定会在erlangs端产生错误。)
  5. <强>示范

    控制台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>
    

    控制台2:

     $ echo "hi" |  socat - UNIX-SENDTO:/tmp/socket2,bind=/tmp/socket1
    

    控制台1结果:

    okok #Port<0.451>
    {ok,{{local,<<"/tmp/socket1">>},0,"hi\n"}}