¿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