【问题标题】:How an Android native executable accept external socket connections?Android 本机可执行文件如何接受外部套接字连接?
【发布时间】:2014-11-25 04:17:10
【问题描述】:

我正在开发一个 Android 本机可执行服务,该服务在系统启动时由 init 启动(我在 init.rc 中注册)。这个本机可执行文件创建一个侦听 0.0.0.0:4615 的套接字,并且应该接受来自外部的连接。

操作系统是 Android K;它在具有以太网接口的开发套件上运行,可将其插入局域网。

我已经完成了在 adb shell 中以 root 身份运行相同本机可执行文件的测试。它工作正常 - 我的 Windows 机器上的外部套接字客户端可以连接到本机可执行文件并成功发送/接收消息。当我通过 init 启动它时,它成功侦听了 0.0.0.0:4615,但外部套接字客户端无法连接到它 - 连接被拒绝。

我在init.rc中添加的sn-p是:

service msger-daemon /system/bin/msgerd
    class main

“ps”查看msgerd的用户时,发现是root。

请帮忙,谢谢!

【问题讨论】:

  • 无论连接类型如何,C POSIX 套接字都不应该工作吗?
  • 在手机上安装监听服务可能会有问题,因为如果它不在 WIFI 网络上,您将不会事先知道它将获得什么地址,或者电话公司将允许通过以下方式连接到任意端口他们的网络。
  • 不是在手机上,我正在开发支持以太网的开发套件(板)。并且在 adb shell 中运行与 root 相同的可执行文件的测试通过了。我想知道在由 init 启动时如何让它工作。
  • 也许您可以发布有关该服务的 init.rc 脚本。
  • 我在init.rc中添加的sn-p现在有问题了。

标签: android c++ sockets android-service android-framework


【解决方案1】:

通过在$TOP/external/sepolicy下添加一个SE策略文件解决,该文件内容为:

# File types must be defined for file_contexts.
type msgerd, domain;
type msgerd_exec, exec_type, file_type;

init_daemon_domain(msgerd)

permissive msgerd;

# Add msgerd to various domains
net_domain(msgerd)
allow msgerd self:capability { net_admin net_raw };

如果有人想评论和建议,欢迎!

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2013-10-10
    相关资源
    最近更新 更多