如何从Erlang向现有的Unix套接字发送消息?

时间:2018-12-13 20:10:00

标签: erlang unix-socket

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

我想将消息发送到现有的Unix套接字(以通过其JSON IPC接口控制mpv)。我看到有a self-answered question on the Erlang mailing list的问题,但是答案对我来说没有意义,因为# include <stdio.h> #define rowsize 3 #define colsize 3 int main() { int R[rowsize][colsize]={1,2,3,4,5,6,7,8,9}; int Rnew[rowsize][colsize]; copy_from_R_to_Rnew(R,&Rnew); int i,j; for(i=0;i<rowsize;i++) { for(j=0;j<colsize;j++){ printf("\t %d",Rnew[i][j]); } printf("\n"); } return(0); } void copy_from_R_to_Rnew(int *R,int *Rnew) { int i,j; for(i=0;i<rowsize;i++) { for(j=0;j<colsize;j++){ *(Rnew+i*colsize+j) = *(R+i*colsize+j); } } } 是在没有事先分配的情况下使用的。

我在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

如何将消息发送到现有的Unix套接字?

1 个答案:

答案 0 :(得分:0)

我的案子的答案

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

  

据我了解,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).