我们在AF_UNIX(本地文件)上使用SOCK_STREAM创建套接字。我们在系统上有许多客户端进程,我们只对向这些客户端广播消息感兴趣。操作系统是Ubuntu 14.04.5 LTS。
如果文件权限是666,这一切都有效,但作为安全措施,我们要将其更改为644.但是,当客户端尝试使用以下代码进行连接时,这会导致权限异常:
int XyzClient::establish_connection() {
int fd;
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
throw XyzException(strerror(errno));
}
sockaddr_un addr = {};
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, DEFAULT_SOCKET_PATH, sizeof(addr.sun_path)-1);
if (connect(fd, (sockaddr*)&addr, sizeof(addr)) == -1) {
// connect failed, close fd and throw exception
close(fd);
throw XyzException(strerror(errno));
}
return fd;
}
据推测,问题是上面的代码试图建立对文件的读写访问权,并导致权限错误。
是否可以执行单向SOCK_STREAM,以便我们可以将文件锁定为除了所有者/广播者之外的所有人只读?
答案 0 :(得分:1)
无法创建只读的unix域套接字并使用文件权限强制执行此操作。从相关手册页unix(7)
在Linux上,连接到流套接字对象需要对该套接字具有写权限;将数据报发送到数据报套接字同样需要对该套接字具有写入权限。 POSIX不会对权限对套接字文件的影响做出任何声明,并且在某些系统(例如,较旧的BSD)上,套接字权限将被忽略。便携式程序不应该依赖此功能来保证安全。