LocalSocket communication with Unix Domain in Android NDK

Rohit picture Rohit · Feb 1, 2013 · Viewed 11.4k times · Source

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

Answer

John picture John · Oct 14, 2014

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