【问题标题】:How can I send messages to an existing Unix socket from Erlang?如何从 Erlang 向现有的 Unix 套接字发送消息?
【发布时间】:2018-12-13 20:10:00
【问题描述】:

我看到gen_udp 支持 Unix 套接字,this example 显示在 Erlang 中创建了一个 using one。

我想向现有的 Unix 套接字发送消息(通过其 JSON IPC 接口控制mpv)。我看到有 a self-answered question on the Erlang mailing list 关于这个,但答案对我来说没有意义,因为 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 套接字发送消息?

【问题讨论】:

  • 如果你得到Sock2这样的邮件列表示例:{ok, Sock2} = gen_udp:open(0, [local]).

标签: erlang unix-socket


【解决方案1】:

回答我的情况

这不是一个规范而彻底的答案,因为我对套接字不是很熟悉。但是,我通过上面的邮件列表链接给 Joe 发了电子邮件,他说:

据我了解,unix socket类型到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).

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多