Вопрос

Есть ли способ получить доступ к доменным сокетам UNIX (например/var/run/dbus/system_bus_socket ) непосредственно из Erlang без прибегаете к стороннему драйверу?

Это было полезно?

Решение

Erlang/OTP поставляется только с драйверами для сокетов TCP и UDP.Так...

Нет.

Драйверы третьей части

Другие советы

В Erlang / OTP 19.0 теперь доступны сокеты UNIX, как указано в readme:

Приложение (ы) OTP-13572:erts, ядро

Связанный идентификатор (ы):ПР-612

* ВЫДЕЛИТЕ *

Экспериментальная поддержка для доменных сокетов Unix была Реализована экспериментальная поддержка доменных сокетов Unix.Почитайте источники, если хотите попробовать .Пример:gen_udp:открыть(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> 

Тот самый nanomsg библиотека поддерживает доменные сокеты Unix, а также enm водитель предоставляет привязку к языку Erlang для nanomsg.

Например, чтобы открыть сторону ответа протокола запроса / response и привязаться к адресу доменного сокета Unix:

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

Здесь, Rep является nanomsg розетка.Он поддерживает send и recv так же , как и весь обычный эрланг {active, true | false | N} режимы и т.д.это обеспечивают обычные сокеты Erlang TCP / SCTP / UDP.Для получения более подробной информации обратитесь к enm github README.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top