Question

Y at-il un moyen d'accéder sockets de domaine UNIX (par exemple / var / run / dbus / system_bus_socket) directement à partir Erlang sans le recours à un pilote tiers?

Était-ce utile?

La solution

Erlang / OTP est livré avec les pilotes pour prises et udp seulement tcp. Alors ...

Non.

pilotes tiers partie

Autres conseils

Dans Erlang / OTP 19,0, les sockets Unix sont maintenant disponibles, comme indiqué dans le readme :

  

OTP-13572 Application (s): Erts, noyau

     

Id connexe (s): PR-612

     

* highlight *

     

Support expérimental pour Unix sockets de domaine a été                  mis en œuvre. Lire les sources si vous voulez essayer                  en dehors. Exemple: gen_udp: ouvert (0,                  [{Ifaddr, {local, "/ tmp / socket"}}]). La documentation sera                  être écrit après les commentaires des utilisateurs sur l'API expérimentale.

Exemple:

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.

Et ce qui suit démontre ses résultats:

$ 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> 

La bibliothèque nanomsg supporte les sockets de domaine Unix, et pilote enm fournit un langage Erlang obligatoire pour nanomsg.

Par exemple, pour ouvrir le côté de la réponse d'un protocole de demande / réponse et se lient à une adresse de socket de domaine Unix:

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

Ici, Rep est une prise nanomsg. Il prend en charge send et recv ainsi que tous les modes de {active, true | false | N} habituels Erlang, etc., qui régulièrement Erlang TCP / prises SCTP / UDP fournissent. Pour plus de détails, consultez le enm github README .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top