C++ 单向短袜流

C++ 单向短袜流,c++,sockets,C++,Sockets,我们正在AF_UNIX(本地文件)上使用SOCK_流创建套接字。我们在系统上有许多进程是客户端,我们只对向这些客户端广播消息感兴趣。操作系统是Ubuntu 14.04.5 LTS 如果文件权限为666,则所有这些都有效,但是作为安全措施,我们希望将其更改为644。但是,当客户端尝试使用以下代码连接时,这会导致权限异常: int XyzClient::establish_connection() { int fd; if ((fd = socket(AF_UNIX, SOCK

我们正在AF_UNIX(本地文件)上使用SOCK_流创建套接字。我们在系统上有许多进程是客户端,我们只对向这些客户端广播消息感兴趣。操作系统是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_流,以便我们可以将文件锁定为除所有者/广播者之外的所有人的只读文件?

不可能创建只读unix域套接字并使用文件权限强制执行此操作。从相关手册页

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


如何从文件制作流媒体套接字?您的意思是使用本地套接字(即
AF_local
AF_UNIX
)?请尝试创建一个可以显示给我们的。如果你以前没做过,请问是哪一个操作系统?Socket不是标准C++库的一部分吗?你到底是指“导致客户端异常”是什么意思?我已经更新了问题,以更清楚。如果仍然不符合标准,请告诉我。是的,你误解了。本地套接字仍然是对等的,而不是广播的。