我想写一个简单的Unix数据报服务器/客户端,并遇到一些问题。我想要的是一台服务器,它侦听数据报套接字并将收到的每条消息的回复发送给原始发件人。我决定尝试首先使用socat
是“服务器”,并在C.编写客户端我正在socat是这样的:如何使用SOCK_DGRAM制作双向unix域套接字?
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");
应该发送的数据包(的作品),接收数据包,然后打印出来,但该方案没有按” t似乎能够接收数据包。我在这里做错了什么,或者我对Unix套接字有一个基本的误解?谢谢!
是的话,由于我使用的是数据报套接字(不SOCK_STREAM),它应该像UDP一样的功能,我可以随时随地发送数据报,而不需要先连接?就像我提到的那样,客户端发送到服务器的部分确实有效。谢谢! – fyhuang