¿Cómo hacer sockets de dominio unix bidireccionales con SOCK_DGRAM?

Estoy tratando de escribir un servidor / cliente simple de datagramas Unix, y tengo algunos problemas. Lo que quiero es un servidor que escuche en un socket de datagrama y envíe una respuesta a cada mensaje recibido, al remitente original. Decidí probar primero usandosocat para ser el "servidor" y escribir el cliente en C. Estoy ejecutando socat de esta manera:

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

Según tengo entendido, esto debería escucharse en/tmp/test.socket y responder a todo lo que se recibe con la misma cadena? Luego tengo un programa cliente que se ve así (se eliminó la comprobación de errores para mayor claridad):

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");

Debería enviar el paquete (que funciona), recibir un paquete y luego imprimirlo, pero el programa no parece ser capaz de recibir el paquete. ¿Qué estoy haciendo mal aquí, o tengo un malentendido fundamental sobre los sockets Unix? ¡Gracias

Respuestas a la pregunta(3)

Su respuesta a la pregunta