10

我有 Android 应用程序,它需要与我们的 C++ 库建立 unix 域套接字连接(使用 Android NDK)

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

java中有LocalSocket接受“字符串”(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域套接字接受“绝对路径”。那么这两方如何相互沟通呢?

如果可能,请分享任何示例

4

2 回答 2

15

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)bindorsendto因为 '\0' 字符后面的所有字节都被解释为抽象套接字名称。计算并传递实际尺寸:

int res = sendto(sock, &data, sizeof(data), 0,
                 (struct sockaddr const *) &addr,
                 sizeof(addr.sun_family) + sizeof(name) - 1);
于 2014-10-14T12:58:19.170 回答
0

Pro Android C++ 与 NDK 书,第 10 章帮助我开始使用它。

于 2013-02-06T07:09:57.967 回答