Android(原生):为什么我的套接字不可用于其他进程?

时间:2013-12-16 02:39:54

标签: android security sockets android-ndk ipc

所以我通过init.rc启动一个自定义本机守护进程。 它试图这样做:

x_con = android_get_control_socket("test");
int ret = listen(x_con, 1);
int new_s = accept(x_con, (struct sockaddr*)&peeraddr, &socklen);

或者这个:

x_con = socket_local_server("test:, ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM );
int new_s = accept(x_con, (struct sockaddr*)&peeraddr, &socklen);

在任何一种情况下,我都可以看到/dev/socket下的套接字,它的访问掩码为0666(由于init.rc中设置了参数),但仍然无法接受任何连接(似乎其他人无法使用)进程)。

这是由于“偏执狂网络”Android的功能吗?

1 个答案:

答案 0 :(得分:0)

与“普通”套接字相比,Android套接字模型似乎非常奇怪。

首先,在给定某些权限的情况下,必须通过init.rc初始化套接字。

接下来,服务器应用程序打开它:

x_con = android_get_control_socket("test");

接下来,需要listen()和fnctl()调用:

listen(x_con, 1);
fcntl(x_con, F_SETFD, FD_CLOEXEC);

之后,来自Java的LocalSocket连接可以访问套接字,而套接字可以接受客户端。

也允许稍后设置非阻止模式:

fnctl(x_con, F_SETFL, O_NONBLOCK);

其他组合是不必要的(并且有一些指南,如使用Android中的无线电层接口(RIL) - 不会链接到那个低级手册 - 说明socket_local_server和android_get_control_socket是必需的,这显然是不真实的。)