将本机 Winsock 套接字传递给 Java 套接字

发布于 2024-09-08 19:19:41 字数 138 浏览 1 评论 0原文

我需要将 C++ 应用程序创建的本机 Winsock 套接字传递到应用程序中使用 java.net.Socket 连接到服务器的库。 此 Winsock 应用程序已经负责连接套接字。

如何显式设置 java.net.Socket 的套接字描述符?

I need to pass a native winsock socket created by C++ application to a library in my application that uses java.net.Socket to connect to a server.
This Winsock appication already take care of connecting the socket.

How can I explicitly set the socket descriptor of java.net.Socket?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

彡翼 2024-09-15 19:19:41

我在 Unix 上遇到了这样的问题,不确定同样的机制是否适用于 WinSock。

在我们的例子中,C 程序使用特殊硬件创建套接字。 C 程序生成 Java 程序并将套接字传递给它。然后,Java 程序从套接字的文件描述符构造输入/输出流,以便它可以像普通套接字一样对其进行读/写。

Java 代码片段在这里,

    Class<FileDescriptor> clazz = FileDescriptor.class;

    Constructor<FileDescriptor> c;
    try {
            c = clazz.getDeclaredConstructor(new Class[] { Integer.TYPE });
    } catch (SecurityException e) {
            e.printStackTrace();
            return;
    } catch (NoSuchMethodException e) {
            e.printStackTrace();
            return;
    }

    c.setAccessible(true);
    FileDescriptor fd;
    try {
            fd = c.newInstance(new Integer(socket));
    } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return;
    } catch (InstantiationException e) {
            e.printStackTrace();
            return;
    } catch (IllegalAccessException e) {
            e.printStackTrace();
            return;
    } catch (InvocationTargetException e) {
            e.printStackTrace();
            return;
    }

    FileOutputStream os = new FileOutputStream(fd);
    FileInputStream is = new FileInputStream(fd);

I encountered such a problem on Unix, not sure if the same mechanism works for you with WinSock.

In our case, a program in C creates a socket using special hardware. The C program spawns the Java program passes it the socket. The Java program then constructs input/output stream from the file descriptor of the socket so it can read/write to it just like a normal socket.

The Java code snippet is here,

    Class<FileDescriptor> clazz = FileDescriptor.class;

    Constructor<FileDescriptor> c;
    try {
            c = clazz.getDeclaredConstructor(new Class[] { Integer.TYPE });
    } catch (SecurityException e) {
            e.printStackTrace();
            return;
    } catch (NoSuchMethodException e) {
            e.printStackTrace();
            return;
    }

    c.setAccessible(true);
    FileDescriptor fd;
    try {
            fd = c.newInstance(new Integer(socket));
    } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return;
    } catch (InstantiationException e) {
            e.printStackTrace();
            return;
    } catch (IllegalAccessException e) {
            e.printStackTrace();
            return;
    } catch (InvocationTargetException e) {
            e.printStackTrace();
            return;
    }

    FileOutputStream os = new FileOutputStream(fd);
    FileInputStream is = new FileInputStream(fd);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文