Я пытаюсь написать простой сервер / клиент дейтаграмм 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?Спасибо!