Как я могу отправлять сообщения в существующий сокет Unix от Erlang? - PullRequest
0 голосов
/ 13 декабря 2018

Я вижу, что gen_udp имеет поддержку сокетов Unix, а в этом примере показывает создание использования в Erlang.

Я хочу отправлять сообщения существующемуUnix-сокет (для управления mpv через его интерфейс JSON IPC).Я вижу, * * * * * * * * * * * * * * * * * * * * * * * * * * Я не знаю, есть ли ответ на вопрос в списке рассылки Erlang , поскольку Sock2 используется без предварительного назначения.

В документах gen_udp я вижу эту опцию:

{fd, integer() >= 0}

  If a socket has somehow been opened without using gen_udp,
  use this option to pass the file descriptor for it.

Но когда я пытаюсь открыть сокет как файл с помощью file:open/2, я получаю {error,eopnotsupp}.

Как я могу отправлять сообщения в существующий сокет Unix?

1 Ответ

0 голосов
/ 14 декабря 2018

Ответ для моего случая

Это не будет каноническим и полным ответом, потому что я не очень знаком с сокетами.Однако я отправил Джо письмо по ссылке выше, и он сказал:

Насколько я понимаю, отображение типа сокета unix на erlang отображается следующим образом:

SOCK_STREAM -> gen_tcp
SOCK_DGRAM -> gen_udp
SOCK_SEQPACKET -> gen_sctp

Он предложил использовать gen_tcp:connect в моем случае, и это сработало!Очевидно, mpv создал сокет SOCK_STREAM.

Итак, запустив mpv как:

mpv /Users/me/playlist.m3u --input-ipc-server=/tmp/mpv.sock --idle yes --no-audio-display

... так, что он ожидает команды на сокете /tmp/mpv.sock, яможет послать ему команду «воспроизвести другой плейлист», как это в erl:

{ok, Port} = gen_tcp:connect({local, "/tmp/mpv.sock"}, 0, [local]).
Msg = "{ \"command\": [\"loadlist\", \"/Users/me/playlist2.m3u\", \"replace\"] }\n".
gen_tcp:send(Port, Msg).
...