【问题标题】:Raw Sockets on AndroidAndroid 上的原始套接字
【发布时间】:2011-02-06 04:47:26
【问题描述】:

我想创建一个在 Android 上运行并使用原始套接字的应用程序。我看到 java.net.* 或 android.net.* 库中没有任何原始套接字支持。 Android 上可以使用原始套接字吗?

【问题讨论】:

    标签: android sockets


    【解决方案1】:

    任何 Java 或 Android 库都不支持正确的原始套接字,部分原因是(我引用自 here):

    相信这样的包 会降低当前的 Java 安全模型,可能难以 在非操作系统中实现 (OS) 依赖的方式。

    有像 RockSawJSocket 这样的 3rd 方库,但是这些库需要编译 C 或 C++,所以你不走运。

    另外,我相信您需要 root 访问权限才能使用原始套接字。

    所以,尽管如此,我想说从技术上讲这是可能的,但目前不实用。

    【讨论】:

    • 您可以将 Android NDK 用于 C/C++ 代码。不过,这对访问限制没有帮助。
    • 我实际上需要原始套接字。使用原始套接字的目的是可以操纵数据包。我想写一个 PPPoE 层,它需要访问原始数据包。它确实需要在与内置 VPN 客户端相同的级别上运行。是否有类似 DDK 的工具包可以让您在 Android 上编写驱动程序级别的代码?
    • @Tingo 和 Steve:“我相信你需要 root 访问权限才能使用原始套接字”:更准确地说,你需要 CAP_NET_RAW capability,但是是的,除非使用更细粒度的权限管理,否则归结起来到“根”。
    【解决方案2】:

    为什么不使用 Android 进程间通信,例如:

    AIDL, 意图, 广播等

    例如见http://developer.android.com/guide/topics/fundamentals/services.html。 他们使用内部原始套接字

    【讨论】:

      【解决方案3】:

      据我所知,这在 Android 上是不可能的。由于安全原因(我猜),不在 java 或 c/c++ 中,唯一可能的解决方案是通过一些具有 root 访问权限的 hack。我也一直在寻找一种方法,但没有找到任何东西。

      【讨论】:

        【解决方案4】:

        我已经能够使用在 QPython 应用程序下运行的 Python 在有根电话上使用原始套接字。这有点笨拙,如果脚本还没有以 root 身份运行,它会用“su”重新调用自己,但它可以工作。

        【讨论】:

        • 问题是关于在 Java 或 Android 中使用套接字,而不是 python。
        猜你喜欢
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        相关资源
        最近更新 更多