Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LocalSocket communication with Unix Domain in Android NDK

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

like image 936
Rohit Avatar asked Feb 01 '13 09:02

Rohit


1 Answers

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);
like image 73
John Avatar answered Sep 21 '22 14:09

John