【问题标题】: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 的功能吗?

【问题讨论】:

    标签: android security sockets android-ndk ipc


    【解决方案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是必需的,这显然是不真实的)。

    【讨论】:

    • 我的一些实验仍然不清楚访问权限 - 有时会使用错误的权限创建套接字。
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多