【问题标题】:How to create a unix socket file with read/write permissions for different users C++?如何为不同的用户 C++ 创建具有读/写权限的 unix 套接字文件?
【发布时间】: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


【解决方案1】:

我已经解决了这个问题,只是按照@Sam Varshavchik 的建议使用 chmod 函数更改权限。

由于两个用户属于同一个组,我使用 S_IRWXG 设置组的所有权限。

chmod(socket_path.c_str(), S_IRWXG);

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 2021-01-17
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多