如何将java.net.Socket传递给等待' BoostSocket.assign(tcp::v4(), nati

How to pass java.net.Socket to a C++ DLL function waiting for `BoostSocket.assign(tcp::v4(), nativeSocketFromJava);`

本文关键字:assign BoostSocket nati tcp v4 net java Socket 等待      更新时间:2023-10-16

所以我想知道它是可能的,以及如何通过套接字从java到一些DLL库等待本机这个操作系统套接字?有人能举个例子吗?是否有可能使用org.apache.tomcat. jndi . socket ?

首先,我们需要获得java.net.Socket的文件描述符。使用反射机制可以做到这一点。这个想法是在java.net.SocketImpl上访问java.io.FileDescriptor,然后获得一个本地套接字描述符。参见DualStackPlainSocketImpl.java的代码片段(此方法也由Zoran Regvart在这里指出)。

另一种方法是使用JNI,如这里讨论的,这里有一个例子:
static int getFd(JNIEnv *env, jobject sock)
{
    JNIEnv e = *env;
    jclass clazz;
    jfieldID fid;
    jobject impl;
    jobject fdesc;
    /* get the SocketImpl from the Socket */
    if (!(clazz = e->GetObjectClass(env,sock)) ||
        !(fid = e->GetFieldID(env,clazz,"impl","Ljava/net/SocketImpl;")) ||
        !(impl = e->GetObjectField(env,sock,fid))) return -1;
    /* get the FileDescriptor from the SocketImpl */
    if (!(clazz = e->GetObjectClass(env,impl)) ||
        !(fid = e->GetFieldID(env,clazz,"fd","Ljava/io/FileDescriptor;")) ||
        !(fdesc = e->GetObjectField(env,impl,fid))) return -1;
    /* get the fd from the FileDescriptor */
    if (!(clazz = e->GetObjectClass(env,fdesc)) ||
        !(fid = e->GetFieldID(env,clazz,"fd","I"))) return -1;
    /* return the descriptor */
    return e->GetIntField(env,fdesc,fid);
}

我也认为你是在谈论Boost。亚洲的TCP套接字。如果是这样,那么您必须使用assign方法将本机套接字与Asio的套接字对象关联。

请注意,此解决方案可能不适用于某些Java实现,因为它使用的实现的内部细节不能保证保持不变。另外,确保没有并发性(即Java不会试图并行地从同一个套接字描述符中读取)等。换句话说,使用风险自负。

希望有帮助。好运!