我有Android应用程序,需要与我们的C ++库(使用Android NDK)build立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域套接字接受“绝对path”。 那么这两方怎么可以相互沟通?
请尽可能分享任何示例
LocalSocket使用Linux抽象名称空间而不是文件系统。 在C中,这些地址是通过在path中加上'\ 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)
来bind
或发送,因为'\ 0'字符之后的所有字节都被解释为抽象套接字名称。 计算并通过实际大小,而不是:
int res = sendto(sock, &data, sizeof(data), 0, (struct sockaddr const *) &addr, sizeof(addr.sun_family) + sizeof(name) - 1);
与NDK书,第10章的Android C + +,帮助我开始相同的。