将Java套接字文件描述符传递给C二进制文件的最有效方法

时间:2012-07-12 15:55:34

标签: java c sockets java-native-interface file-descriptor

我似乎无法在任何地方找到答案,我正在尝试用Java获取套接字,并交出其文件描述符编号,以便我可以在C二进制文件中使用它(fd将作为参数) 。

我使用反射获取了FileDescriptor但无法在任何地方访问实际数字。

我知道其他人已经建议过JNI,但如果可能的话我想把它保存在Java中(并且无法完全弄清楚如何做到这一点)

2 个答案:

答案 0 :(得分:2)

在Java 7中,您可以将SocketInputStream转换为FileInputStream,并致电getFD()以获取FileDescriptor对象。

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


请注意,这样做可能会使您的代码平台依赖。无法保证特定的私有字段将出现在较旧的......或即将到来的Java版本中,或者由其他供应商/供应商完成的Java实现中。

答案 1 :(得分:0)

Stephen C的答案解决了如何获得FileDescriptor,但这是一个来自该对象的文件描述符编号的方法。在Windows上,FileDescriptor在内部使用long handle而不是int fd,因此此方法首先检查是否使用handle,如果是,则返回,否则返回fd 1}}。我没有像OP那样使用套接字对此进行测试,但我想{J}仍然使用Windows。{/ p>

handle