所以我通过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的功能吗?
答案 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是必需的,这显然是不真实的。)