我想在 Linux 上的多个进程之间建立 IPC 连接。我以前从未使用过 UNIX 套接字,因此我不知道这是否是解决此问题的正确方法。
一个进程接收数据(未格式化的、二进制的)并应使用数据报协议(即类似于带有 AF_INET 的 UDP)通过本地 AF_UNIX 套接字分发该数据。从该进程发送到本地 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);
在这里,绑定失败(“地址已在使用中”)。那么,我是否需要设置一些套接字选项,或者这通常是错误的方法?
提前感谢您的任何评论/解决方案!