Me gustaría establecer una conexión IPC entre varios procesos en Linux. Nunca antes había usado conectores UNIX, y por lo tanto, no sé si este es el enfoque correcto para este problema.Socket de dominio Unix: uso de comunicación de datagramas entre un proceso de servidor y varios procesos de cliente
Un proceso recibe datos (no formateados, binarios) y distribuirá estos datos a través de un socket local AF_UNIX utilizando el protocolo de datagramas (es decir, similar a UDP con AF_INET). Los datos enviados desde este proceso a un socket Unix local deben ser recibidos por múltiples clientes que estén escuchando en el mismo socket. La cantidad de receptores puede variar.
Para lograr esto el siguiente código se utiliza para crear un socket y enviar datos a la misma (el proceso de servidor):
struct sockaddr_un ipcFile;
memset(&ipcFile, 0, sizeof(ipcFile));
ipcFile.sun_family = AF_UNIX;
strcpy(ipcFile.sun_path, filename.c_str());
int socket = socket(AF_UNIX, SOCK_DGRAM, 0);
bind(socket, (struct sockaddr *) &ipcFile, sizeof(ipcFile));
...
// buf contains the data, buflen contains the number of bytes
int bytes = write(socket, buf, buflen);
...
close(socket);
unlink(ipcFile.sun_path);
rendimientos Esta escritura -1 con errno informes ENOTCONN ("punto final de transporte no está conectado "). Supongo que esto se debe a que ningún proceso de recepción está escuchando este conector local, ¿correcto?
Luego, traté de crear un cliente que se conecta a este socket.
struct sockaddr_un ipcFile;
memset(&ipcFile, 0, sizeof(ipcFile));
ipcFile.sun_family = AF_UNIX;
strcpy(ipcFile.sun_path, filename.c_str());
int socket = socket(AF_UNIX, SOCK_DGRAM, 0);
bind(socket, (struct sockaddr *) &ipcFile, sizeof(ipcFile));
...
char buf[1024];
int bytes = read(socket, buf, sizeof(buf));
...
close(socket);
Aquí, el enlace falla ("Dirección ya en uso"). Entonces, ¿tengo que establecer algunas opciones de socket, o este es generalmente el enfoque equivocado?
¡Gracias de antemano por sus comentarios/soluciones!
Check también PHP como cliente y como servidor de C [aquí] (http://stackoverflow.com/a/43421610/4626775) –