我看到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套接字?
答案 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).