【发布时间】:2020-08-13 12:18:04
【问题描述】:
我在 linux 的 2 个不同用户中运行了 2 个不同的应用程序。 我希望它们通过 unix 套接字连接,并且由于路径名知道 unix 域套接字,因此 2 个应用程序需要共享相同的路径和相同的套接字文件。 这里的问题是,在服务器中绑定套接字时,一切都很好,但是当尝试从第二个应用程序连接时,出现错误“访问被拒绝”。
这是我用于创建套接字文件的服务器的代码。
int main() {
struct sockaddr_un addr;
char buf[100];
int fd,cl,rc;
if (argc > 1) socket_path=argv[1];
if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(-1);
}
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
if (*socket_path.c_str() == '\0') {
*addr.sun_path = '\0';
strncpy(addr.sun_path+1, socket_path.c_str()+1, sizeof(addr.sun_path)-2);
} else {
strncpy(addr.sun_path, socket_path.c_str(), sizeof(addr.sun_path)-1);
unlink(socket_path.c_str());
}
if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
perror("bind error");
exit(-1);
}
if (listen(fd, 5) == -1) {
perror("listen error");
exit(-1);
}
return 0;
}
【问题讨论】:
-
查看套接字文件本身。它的所有权和权限与任何其他文件的所有权和权限的含义完全相同。您可能需要将套接字文件权限授予“其他”。你可以用 chmod 做到这一点。
-
注意,依靠socket文件权限来控制谁可以连接它是不可移植的;请参阅Linux manpage 中的路径名套接字所有权和权限。
标签: c++ linux sockets c++11 unix-socket