单向SOCK_STREAM

时间:2016-09-07 17:45:41

标签: c++ sockets

我们在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,以便我们可以将文件锁定为除了所有者/广播者之外的所有人只读?

1 个答案:

答案 0 :(得分:1)

无法创建只读的unix域套接字并使用文件权限强制执行此操作。从相关手册页unix(7)

  

在Linux上,连接到流套接字对象需要对该套接字具有写权限;将数据报发送到数据报套接字同样需要对该套接字具有写入权限。 POSIX不会对权限对套接字文件的影响做出任何声明,并且在某些系统(例如,较旧的BSD)上,套接字权限将被忽略。便携式程序不应该依赖此功能来保证安全。