1

如何获取 Java 数据报套接字的文件描述符?我在网上搜索没有任何成功。

斯里尼

4

3 回答 3

6

老问题,但是对于遇到此问题的其他任何人,您都可以这样做...

DatagramSocket socket = ....();
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromDatagramSocket(socket);
FileDescriptor fd = pfd.getFileDescriptor();
于 2015-06-18T20:27:36.347 回答
0

您将需要一个自定义工厂来返回 DatagramSocketImpl 的自定义子类,该子类具有文件描述符的公共 get 函数。

于 2010-09-22T14:50:22.717 回答
0

您可以使用反射检索 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;
    }

}
于 2021-05-12T08:35:00.273 回答