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)

Android - 本机套接字在第一次尝试时未删除 3G-sleep-mode

C++/CLI 为啥对托管不可见

Android Studio 附加到进程未找到本机符号

为啥没有调用android端的socket.io监听器?