java数据报套接字的文件描述符

Posted

技术标签:

【中文标题】java数据报套接字的文件描述符【英文标题】:File descriptor of a java datagram socket 【发布时间】:2010-09-22 14:44:18 【问题描述】:

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

斯里尼

【问题讨论】:

【参考方案1】:

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

DatagramSocket socket = ....();
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromDatagramSocket(socket);
FileDescriptor fd = pfd.getFileDescriptor();

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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


【讨论】:

以上是关于java数据报套接字的文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

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

lsof命令简介

linux lsof命令详解

linux中的文件描述符与套接字socket

通过 ioctl 调用套接字文件描述符获取数据包时间戳

lsof