11

有没有办法直接从 Erlang 访问 UNIX 域套接字(例如 /var/run/dbus/system_bus_socket )而不求助于第三方驱动程序?

4

4 回答 4

14

Erlang/OTP 带有仅用于 tcp 和 udp 套接字的驱动程序。所以...

不。

第三部分驱动程序

于 2009-09-25T20:19:39.400 回答
14

在 Erlang/OTP 19.0 中,UNIX 套接字现在可用,如自述文件中所述

OTP-13572 应用程序:erts、内核

相关 ID:PR-612

* 强调 *

已实现对 Unix 域套接字的实验性支持。如果您想尝试一下,请阅读源代码。示例:gen_udp:open(0, [{ifaddr,{local,"/tmp/socket"}}])。文档将在用户反馈实验性 API 后编写。

例子:

lsock.erl:

-module(lsock).
-export([watcher/1, test/0]).

watcher(Parent) -> 
  {ok, Sockin} = gen_udp:open(0, [{ifaddr, {local, "/tmp/testsockin"}}]),
  io:format("watcher ok? ~w ~w~n", [ok, Sockin]),
  Parent ! start,
  receive
    Msg -> io:format("watcher got: ~p ~n", [Msg]) end.

test() ->
  file:delete("/tmp/testsockin"),
  file:delete("/tmp/testsockout"),
  _ = spawn(lsock, watcher, [self()]),
  {ok, Sockout} = gen_udp:open(0, [{ifaddr, {local, "/tmp/testsockout"}}]),
  io:format("parent ok? ~w ~w~n", [ok, Sockout]),
  receive start ->
    gen_udp:send(Sockout, {local, "/tmp/testsockin"}, 0, "hi") end.

下面展示了它的结果:

$ erlc lsock.erl 
$ 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> lsock:test().
<0.58.0>
parent ok? ok #Port<0.455>
watcher ok? ok #Port<0.456>
watcher got: {udp,#Port<0.456>,{local,<<"/tmp/testsockout">>},0,"hi"} 
ok
2> 
于 2016-07-09T22:41:03.323 回答
1

nanomsg支持 Unix 域套接字,enm驱动程序nanomsg.

例如,要打开请求/响应协议的响应端并绑定到 Unix 域套接字地址:

Url = "ipc:///path/to/socket/file",
{ok,Rep} = enm:rep([{bind,Url}]),

这里,Rep是一个nanomsg插座。它支持常规 Erlang TCP/SCTP/UDP 套接字提供的所有常用 Erlang模式send等。有关更多详细信息,请参阅github READMErecv{active, true | false | N}enm

于 2014-10-24T18:37:00.977 回答
0

如果您想接收 http 响应,您可以使用hackney ,因为 hackney 提供对 UNIX socket 的支持。hackney:get<<"http+unix://path_to_sock_file.sock">>

于 2020-08-05T13:36:51.830 回答