LocalSocket communication with Unix Domain in Android NDK

匿名 (未验证) 提交于 2019-12-03 00:46:02

问题:

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.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!