2023-01-19 311
我似乎无法在任何地方找到答案,我正在尝试在Java中获取插座,然后移交其文件描述符编号,以便我可以在C二进制中使用它(FD将作为参数) .
我已经使用反射获得了归档的标题…但无法在任何地方访问实际号码.
我知道其他人建议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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态