2016-07-07 108 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"}}