5

我正在尝试编写一个简单的 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 套接字有根本的误解?谢谢!

4

3 回答 3

12

看看 Michael Kerrisk 的 AF_UNIX SOCK_DGRAM 示例,该示例在《Linux 编程接口》第 57 章中发表。

于 2013-09-10T06:46:44.650 回答
1

套接字需要有地址才能接收数据包。您可以bind()使用基于 PID 的唯一套接字文件名进行调用,或者在 linux 中使用自动绑定抽象地址(如果之前调用)send

bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));
于 2016-05-25T21:05:53.747 回答
-1

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

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

于 2011-09-06T20:52:36.583 回答