Android NDK中使用Unix域的LocalSocket通信

11

我有一个 Android 应用程序,需要使用 Android NDK 与我们的 C++ 库建立 Unix 域套接字连接。

public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING

Java 中有 LocalSocket,它接受字符串类型的参数 "string"(your.local.socket.address)。

#define ADDRESS     "/tmp/unix.str" /* ABSOLUTE PATH */
  struct sockaddr_un saun, fsaun;
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("server: socket");
        exit(1);
    }
    saun.sun_family = AF_UNIX;
    strcpy(saun.sun_path, ADDRESS);

但是位于本地层的Unix域套接字接受“绝对路径”。那么这两个方​​法如何相互通信?

如果可能,请提供任何示例。


1
请注意,在Android上,临时共享文件夹位于/data/local/tmp - Bernardo Ramos
2个回答

17

LocalSocket使用Linux的抽象命名空间而不是文件系统。在C语言中,这些地址是通过在路径前面添加'\0'来指定的。

const char name[] = "\0your.local.socket.address";
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;

// size-1 because abstract socket names are *not* null terminated
memcpy(addr.sun_path, name, sizeof(name) - 1);

此外,请注意不要将sizeof(sockaddr_un)传递给bindsendto,因为在'\0'字符后的所有字节都被解释为抽象套接字名称。请计算并传递实际大小:

int res = sendto(sock, &data, sizeof(data), 0,
                 (struct sockaddr const *) &addr,
                 sizeof(addr.sun_family) + sizeof(name) - 1);

这对我帮助很大!但是我在服务器端获取客户端的sockaddr和长度时遇到了问题。我希望客户端通过UDP向服务器发送一条消息,然后服务器应该向客户端回复信息。我在服务器端使用recvfrom(_serverSocket, _messageBuffer, INPUT_BUFFER, 0, (struct sockaddr *)&_clientAddress, &_clientAddressLength);,但是_clientAddressLength为零,_clientAddress为空,尽管从客户端到服务器的消息已经正确接收,但我无法回复客户端。 - Michael P
这是我的代码 https://dev59.com/9Y3da4cB1Zd3GeqP2qEz?noredirect=1#comment51445587_31755790 - Michael P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接