2016-07-07 52 views
3

做Unix域套接字的工作,我尝试了一些东西,但我不能够读取他们什么如何在二郎山19

{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()。什么都没显示

+0

是否所述第一命令执行甚至?它似乎不可能:http://erlang.org/faq/problems.html#idp32954192。有一些讨论和补丁(http://comments.gmane.org/gmane.comp.lang.erlang.patches/4775),但显然你必须在Erlang之外创建unix套接字或使用NIF。 –

+0

它根据最新版本的笔记,这是一个新的东西。 – ForeverConfused

+0

啊!我不知道这个变化。它是否在更新日志中提及?无论如何,我会仔细看看。 –

回答

4

我没有尝试过的正式发布19岁,但我可以把它通过工作使用最新的git(截至7月7日):

  1. 禁用主动{active, false}
  2. 使用UNIX的用SENDTO而不是UNIX-CONNECT
  3. socat的套接字绑定到自己的地址(不具约束力解析地址时,在厄兰侧产生一个错误。)

示范

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