获取套接字的Unix套接字路径,创建了一个套接字

问题描述

我需要检查 /proc/%pid/fd/%n 下的某些文件描述是否指向由(例如) /run/user/%n/my_socket 创建的套接字。我尝试使用 O_PATH 打开一个套接字,但打开返回(在某些情况下)fd 高于 -1 和(在其他情况下)-1。此外,当传递良好的 fd(高于 0)时,getsockname 也会失败。

这是我的代码

int sock = -1;
 
if (S_ISSOCK(stat_.st_mode)) {
  
  sock = open(path,O_PATH);
}

if (-1 != sock) {
  if (-1 == getsockname(sock,socket_,&len)) {
  
    if (errno == EBADF) {
    
      puts("BAD FD");
      return false;
    }
    perror("Error while obtaining data about socket");
    exit(1);
  }
  else puts("OKI - this is socket");
  
  if (socket_->sa_family == AF_UNIX)
    puts(socket_->sa_data);
}

重要信息:我知道,当服务器创建套接字时,它仅用于侦听新连接。当客户端连接时,会创建新的套接字来与之对话。所以我的问题是:如何从先前套接字产生的套接字中获取先前的套接字。

解决方法

抱歉回答我自己的问题,但我找到了解决方案。

对 /proc/%n/fd 中的符号链接使用 readlink。如果它有特殊格式,我们可以将其解析为 unix socket 的编号。在下一步中读取整个 /proc/net/unix 文件并搜索从符号链接获得的数字。如果找到,请检查路径。现在,我必须搜索方法来解析符号链接和 /proc/net/unix 文件。