【问题标题】:Android VpnService protect socket that's stored in native code?Android VpnService 保护存储在本机代码中的套接字?
【发布时间】:2017-11-12 17:23:35
【问题描述】:

我正在编写一个 VPN 应用程序,用于 VPN 连接的套接字是在我的本机 C 代码中处理的,而不是在 java 中。如何在该套接字上使用VpnService.protect()?我注意到它有一个VpnService.protect(int) 重载,我可以将socket 从本机代码返回的int 返回到Java 并以这种方式保护它吗?

示例

// Native Code
int socket;

JNIEXPORT jint JNICALL
Java_com_my_package_Class_initializeSocket
(
    JNIEnv *env,
    jobject jobj
) {
    socket = socket(AF_INET, SOCK_DGRAM, 0);

    // . . . Handler other socket preparations 

    return (jint)socket;
}

// Java Code
public native int initializeSocket();

. . . 

int socket = initializeSocket();
this.protect(socket);

编辑

我确实找到了描述protect 函数如何工作的this question,看起来它可能在C 中有一个非常简单的实现,因为它看起来只是使用setsockopt 调用。但我对 C 语言也比较陌生,所以我不太了解如何复制它。

【问题讨论】:

  • 我不明白这些VpnService.protect() 方法的作用。他们是否将套接字 保留在 VPN 之外?
  • @nandsito 阅读了这篇文章,它解释了他们的工作:developer.android.com/reference/android/net/…
  • 对于你的问题,我想你可以像你提到的那样做。我不建议在 C 中执行此操作(setsockopt 的东西),因为它会使用私有 API(除了非常难)。如果你希望你可以从 C 调用 Java 代码,那么你可以直接从 C 代码调用VpnService.protect(int),提高封装性
  • @nandsito 我无法避免套接字在 C 中。不幸的是,我使用的库处理套接字并且它是用 C 编写的。不过我确实可以访问套接字。
  • 对不起,我对我的评论进行了修改。可以在 C 中打开套接字,但我不会调用 setsockopt。我要么在 JNI 调用之后在 Java 中调用 VpnService.protect(int),要么直接在 JNI 中调用 VpnService.protect(int)

标签: java android c sockets android-vpn-service


【解决方案1】:

我只是想验证我的流程是否有效,在完成更多测试后,我已经验证它可以工作。

示例

// Native Code
int socket;

JNIEXPORT jint JNICALL
Java_com_my_package_Class_initializeSocket
(
    JNIEnv *env,
    jobject jobj
) {
    socket = socket(AF_INET, SOCK_DGRAM, 0);

    // . . . Handler other socket preparations 

    return (jint)socket;
}

// Java Code
public native int initializeSocket();

. . . 

int socket = initializeSocket();
this.protect(socket);

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2016-12-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多