使用 @ 了解套接字路径(抽象套接字)

Understanding Socket paths with @ (Abstract Sockets)

套接字路径中的@是什么?

我正在使用 LocalServerSocket() 打开一个 unix 套接字。

root@device:/dev/socket # netstat -a
.......
Proto RefCnt Flags       Type       State         I-Node Path
Active UNIX domain sockets (servers and established)
unix  2      [ ACC ]     STREAM     LISTENING      37305 @/storage/my_sock
unix  20     [ ]         DGRAM                      7231 /dev/socket/logdw
unix  2      [ ACC ]     SEQPACKET  LISTENING       7234 /dev/socket/logdr
unix  2      [ ACC ]     STREAM     LISTENING       7236 /dev/socket/logd
.......

与其他套接字不同,我的套接字带有 @ 前缀。另外,我去检查了 /storage 分区。我在那里找不到生成的套接字。

我创建套接字的代码如下所示。

LocalServerSocket lss = new LocalServerSocket("/storage/my_sock");
LocalSocket sock = lss.accept();
InputStream ins = sock.getInputStream();

我的想法是从 Java 打开一个本地服务器套接字,并将其用作与本机 C 应用程序交互的通信通道。但是由于路径无效,我无法实现。

unix套接字路径中的

@表示它们是抽象套接字。在磁盘上物理上看不到抽象套接字。在 android LocalServerSocket() 中创建抽象套接字。

Android :

LocalServerSocket lss = new LocalServerSocket("my_sock");
LocalSocket sock = lss.accept();
InputStream ins = sock.getInputStream();

母语:

为了从本机应用程序打开相同的抽象套接字,定义 sun_path 如下。

sock.sun_family = AF_UNIX;
sock.sun_path[0] = '[=11=]'
strcpy(&sock.sun_path[1], "my_sock");
sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
len_addr = offsetof(struct sockaddr_un, sun_path) + strlen("my_sock") + 1;
res = connect(sock_fd, (struct sockaddr *)&sock, len_addr);

请注意,sun_path 的第一个字节是'\0',实际名称从&sun_path[1] 继续。按照这种命名套接字的命名规范,系统识别出我们要操作的是一个抽象套接字,并为我们提供了一个。