Я хотел бы установить соединение IPC между несколькими процессами в Linux. Я никогда раньше не использовал сокеты UNIX, и поэтому я не знаю, правильно ли это относится к этой проблеме.
Один процесс получает данные (неформатированные, двоичные) и должен распространять эти данные через локальный сокет AF_UNIX, используя протокол датаграммы (то есть аналогичный UDP с AF_INET). Данные, отправленные из этого процесса в локальный сокет Unix, должны приниматься несколькими клиентами, которые прослушивают один и тот же сокет. Количество приемников может меняться.
Для этого используется следующий код для создания сокета и отправки ему данных (серверный процесс):
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);
Эта запись возвращает -1 с сообщением errno ENOTCONN ( "Конечная точка транспорта не подключена" ). Я предполагаю, что это происходит потому, что в настоящее время ни один процесс приема не прослушивает этот локальный сокет, правильно?
Затем я попытался создать клиента, который подключается к этому сокету.
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);
Здесь сбой не выполняется ( "Адрес уже используется" ). Итак, нужно ли устанавливать некоторые параметры сокетов, или это вообще неправильный подход?
Заранее благодарим за любые комментарии/решения!