问题
I have Android application, which needs to establish unix domain socket connection with our C++ library (using Android NDK)
public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING
There is LocalSocket in java which accepts "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);
But the unix domain socket which is at native layer accepts "absolute path". So how can these two parties communicate to each other?
Please share any example if possible
回答1:
LocalSocket uses the Linux abstract namespace instead of the filesystem. In C these addresses are specified by prepending '\0' to the path.
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);
Also note that you should not pass sizeof(sockaddr_un)
to bind
or sendto
because all bytes following the '\0' character are interpreted as the abstract socket name. Calculate and pass the real size instead:
int res = sendto(sock, &data, sizeof(data), 0,
(struct sockaddr const *) &addr,
sizeof(addr.sun_family) + sizeof(name) - 1);
回答2:
Pro Android C++ with the NDK book, chapter 10 helped me to get started with the same.
来源:https://stackoverflow.com/questions/14643571/localsocket-communication-with-unix-domain-in-android-ndk