将Java插座文件描述符传递到C二进制文件的最有效方法

 2023-01-19    311  

问题描述

我似乎无法在任何地方找到答案,我正在尝试在Java中获取插座,然后移交其文件描述符编号,以便我可以在C二进制中使用它(FD将作为参数) .

我已经使用反射获得了归档的标题…但无法在任何地方访问实际号码.

将Java插座文件描述符传递到C二进制文件的最有效方法

我知道其他人建议JNI,但是如果可能的话,我想将其保留在Java中(并且无法完全弄清楚如何做)

推荐答案

在Java 7中,您可以将A SocketInputStream施放到A FileInputStream,然后调用getFD()获取FileDescriptor对象.

然后,您可以使用反射来访问备案的对象的private int fd字段. (您使用Class.getDeclaredField(…)方法获取字段,调用Field.setAccessible(true),然后使用Field.getInt(…)获得字段的值.)


提防您可能会通过这样做来依赖代码平台.不能保证特定的私有字段将存在于较旧的…或以前的Java版本中,或者在其他供应商/供应商完成的Java实施中.

其他推荐答案

Stephen C的答案解决了如何获得FileDescriptor,但这是该对象的文件描述符编号的方法.在Windows上,FileDescriptor使用int fd而不是内部int fd,因此此方法首先检查是否使用handle并返回,否则,否则会返回返回fd.我尚未像OP所使用的插座测试过,但我想Windows JVMS仍然使用handle.

public static long fileno(FileDescriptor fd) throws IOException {
    try {
        if (fd.valid()) {
            // windows builds use long handle
            long fileno = getFileDescriptorField(fd, "handle", false);
            if (fileno != -1) {
                return fileno;
            }
            // unix builds use int fd
            return getFileDescriptorField(fd, "fd", true);
        }
    } catch (IllegalAccessException e) {
        throw new IOException("unable to access handle/fd fields in FileDescriptor", e);
    } catch (NoSuchFieldException e) {
        throw new IOException("FileDescriptor in this JVM lacks handle/fd fields", e);
    }
    return -1;
}

private static long getFileDescriptorField(FileDescriptor fd, String fieldName, boolean isInt) throws NoSuchFieldException, IllegalAccessException {
    Field field = FileDescriptor.class.getDeclaredField(fieldName);
    field.setAccessible(true);
    long value = isInt ? field.getInt(fd) : field.getLong(fd);
    field.setAccessible(false);
    return value;
}

以上所述是小编给大家介绍的将Java插座文件描述符传递到C二进制文件的最有效方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25873.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。