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
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);