Tôi muốn thiết lập kết nối IPC giữa một số quy trình trên Linux. Tôi chưa bao giờ sử dụng ổ cắm UNIX trước đây, và do đó tôi không biết nếu đây là cách tiếp cận chính xác cho vấn đề này.Ổ cắm tên miền Unix: Sử dụng giao tiếp datagram giữa một quá trình máy chủ và một số quy trình máy khách
Một quy trình nhận dữ liệu (không được định dạng, nhị phân) và sẽ phân phối dữ liệu này qua ổ cắm AF_UNIX cục bộ bằng giao thức datagram (tức là tương tự UDP với AF_INET). Dữ liệu được gửi từ quá trình này đến một ổ cắm Unix cục bộ sẽ được nhận bởi nhiều máy khách đang lắng nghe trên cùng một socket. Số lượng người nhận có thể khác nhau.
Để đạt được điều này các mã sau đây được sử dụng để tạo ra một socket và gửi dữ liệu đến nó (quá trình máy chủ):
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);
viết này trả -1 với errno báo cáo ENOTCONN ("endpoint Giao thông vận tải không được kết nối "). Tôi đoán điều này là do không có quá trình nhận hiện đang nghe ổ cắm cục bộ này, đúng không?
Sau đó, tôi đã cố tạo một ứng dụng khách kết nối với ổ cắm này.
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);
Ở đây, liên kết không thành công ("Địa chỉ đã sử dụng"). Vì vậy, tôi cần phải thiết lập một số tùy chọn ổ cắm, hoặc thường là cách tiếp cận sai?
Cảm ơn trước cho bất kỳ nhận xét/giải pháp nào!
Kiểm tra cũng php như khách hàng và C như máy chủ [ở đây] (http://stackoverflow.com/a/43421610/4626775) –