如何获取 Java 数据报套接字的文件描述符?我在网上搜索没有任何成功。
斯里尼
老问题,但是对于遇到此问题的其他任何人,您都可以这样做...
DatagramSocket socket = ....();
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromDatagramSocket(socket);
FileDescriptor fd = pfd.getFileDescriptor();
您将需要一个自定义工厂来返回 DatagramSocketImpl 的自定义子类,该子类具有文件描述符的公共 get 函数。
您可以使用反射检索 FileDescriptor。以下适用于 Sun-Java 的作品
public static FileDescriptor getFileDescriptor(DatagramSocket ds)
{
try
{
final Field fimpl = ds.getClass().getDeclaredField("impl");
fimpl.setAccessible(true);
final DatagramSocketImpl impl = (DatagramSocketImpl) fimpl.get(ds);
final Method gfd = DatagramSocketImpl.class.getDeclaredMethod("getFileDescriptor",
new Class<?>[0]);
gfd.setAccessible(true);
return (FileDescriptor) gfd.invoke(impl);
}
catch (final Exception e)
{
e.printStackTrace();
return null;
}
}
可以通过以下方式提取本机套接字
public static int FdToInt(FileDescriptor fd)
{
try
{
final Field ffd = FileDescriptor.class.getDeclaredField("fd");
ffd.setAccessible(true);
return (Integer) ffd.get(fd);
}
catch (final Exception e)
{
e.printStackTrace();
return -1;
}
}