One-way SOCK_STREAM
One-way SOCK_STREAM
我们正在使用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,这样我们就可以锁定文件为只读,除了所有者/广播者?
创建只读unix域套接字并通过文件权限强制执行是不可能的。从相关手册页unix(7)
在Linux上,连接到流套接字对象需要对该套接字具有写权限;同样,向数据报套接字发送数据报也需要对该套接字具有写权限。POSIX没有对套接字文件的权限效果做出任何声明,并且在某些系统(例如,较旧的bsd)上,套接字权限被忽略。可移植程序不应该依赖此功能来保证安全性。
相关文章:
- 为什么stream::忽略未按预期工作
- OpenCV RTP-Stream with FFMPEG
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 在 Stream C++ 文本之前有一个额外的换行符
- 在 c++ 中,发生故障后是否需要 stream.clear()?
- 测试"stream >> char"有什么作用?
- 为什么Boost Variant使用模板构造函数而不是Boost::beast::websocket::stream的移
- cv::cuda::Stream选择线程默认流
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- Boost::Beast Websocket Bidirection Stream (C++)
- 实现可以<T>转换为 Stream 的 Stream,<U>其中 U 是 T 的基数
- AWS CPP TransferManager vs GetObjectRequest Stream to File f
- '&'在"std::vector<byte>& stream;"中代表什么
- 由mpglib输出的"hip: Can't rewind stream by 74 bits"到底意味着什么?
- Using boost::asio::async_wait_until with boost::asio::stream
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- 当 stream.peek()=='' 时,流>> z1 有什么用
- git_remote_fetch返回错误并显示消息:"there is no TLS stream available"
- 检测在ofstream写入过程中的空间不足,stream.fail()无法正常工作