如何使用SOCK_DGRAM制作双向unix域套接字?

我正在尝试编写一个简单的Unix数据报服务器/客户端,并且遇到了一些问题。 我想要的是一个服务器,它监听数据报套接字并将收到的每封邮件的回复发送给原始发件人。 我决定首先尝试使用socat作为“服务器”并在C中编写客户端。我正在运行这样的socat:

 socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo 

根据我的理解,这应该监听/tmp/test.socket并回复使用相同字符串收到的所有内容? 然后我有一个看起来像这样的客户端程序(为清楚起见,删除了错误检查):

 int s = socket(AF_UNIX, SOCK_DGRAM, 0); struct sockaddr_un sa; sa.sun_family = AF_UNIX; strcpy(sa.sun_path, "/tmp/test.socket"); const char *data = "Testing data"; int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un)); printf("Sent!\n"); unsigned char *buffer = malloc(BUFFER_LENGTH); struct sockaddr_storage recv_sa; int recv_sa_len = 0; int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len); for (int i = 0; i < recv_len; i++) { putc(buffer[i], stdout); } printf("\n"); 

它应该发送数据包(有效),接收数据包,然后将其打印出来,但程序似乎无法接收数据包。 我在这里做错了什么,或者我对Unix套接字有一个根本的误解? 谢谢!

看看Michael Kerrisk的AF_UNIX SOCK_DGRAM客户端/服务器程序( 客户端 , 服务器 )的示例,该示例发表在他的书“Linux编程接口”第57章中。

您应该在尝试向echo服务器发送任何内容之前调用connect

看看: http : //beej.us/guide/bgipc/output/html/multipage/unixsock.html

套接字需要具有寻址以接收数据包的地址。 您可以使用基于PID的唯一套接字文件名调用bind() ,或者在linux中使用autobound抽象地址调用如果在send之前调用:

 bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));