Android(本机):为啥我的套接字对其他进程不可用?
Posted
技术标签:
【中文标题】Android(本机):为啥我的套接字对其他进程不可用?【英文标题】:Android (native): why my socket isn't available to other processes?Android(本机):为什么我的套接字对其他进程不可用? 【发布时间】:2013-12-16 02:39:53 【问题描述】:所以我正在通过 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
中设置了参数),但仍然无法接受任何连接(似乎对其他进程不可用)。
是因为“Paranoid Network”Android 的功能吗?
【问题讨论】:
【参考方案1】:与“普通”套接字相比,Android 套接字模型似乎很奇怪。
首先,socket 必须通过 init.rc 初始化,并给予一定的权限。
接下来,服务器应用程序打开它:
x_con = android_get_control_socket("test");
接下来,需要 listen() 和 fnctl() 调用:
listen(x_con, 1);
fcntl(x_con, F_SETFD, FD_CLOEXEC);
之后,来自Java的LocalSocket连接可以访问socket,socket可以接受客户端。
也允许稍后设置非阻塞模式:
fnctl(x_con, F_SETFL, O_NONBLOCK);
其他组合是不必要的(并且有一些指南,如 Working with the Radio Layer Interface (RIL) in Android - 不会链接到那个低级手册 - 说明 socket_local_server 和 android_get_control_socket是必需的,这显然是不真实的)。
【讨论】:
我的一些实验仍然不清楚访问权限 - 有时会使用错误的权限创建套接字。以上是关于Android(本机):为啥我的套接字对其他进程不可用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 android webView 不支持 webSocket?
为啥 websocket 在使用代码 1000 响应本机打开后立即关闭。(iOS)