Can I get a Java Socket from a file descriptor num

2019-03-04 12:18发布

When a program is started via FastCGI, it is exec'd with a socket already open to talk to the web server. The socket's file descriptor number is handed to the program, but how can that be converted to something useful in Java, such as a Socket instance?

My hosting service uses mod_fastcgi for Apache httpd. They won't allow me to configure an external server where I provide a host:port to forward requests to via FastCgiExternalServer.

2条回答
手持菜刀,她持情操
2楼-- · 2019-03-04 13:03

You can't do this legally. However, you can do a hack like this (Don't try this at home). You can read from is and write to os.

    Class<FileDescriptor> clazz = FileDescriptor.class;

    Constructor<FileDescriptor> c;
    try {
        c = clazz.getDeclaredConstructor(new Class[] { Integer.TYPE });
    } catch (SecurityException e) {
        e.printStackTrace();
        return;
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
        return;
    }

    c.setAccessible(true);
    FileDescriptor fd;
    try {
        fd = c.newInstance(new Integer(socket));
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        return;
    } catch (InstantiationException e) {
        e.printStackTrace();
        return;
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        return;
    } catch (InvocationTargetException e) {
        e.printStackTrace();
        return;
    }

    FileOutputStream os = new FileOutputStream(fd);
            FileInputStream is = new FileInputStream(fd);
查看更多
forever°为你锁心
3楼-- · 2019-03-04 13:18

What would you want a Socket for? The only useful methods in a socket are getInputStream and getOutputStream but if you’re running as a CGI you already have those: they’re called System.in and System.out. :)

查看更多
登录 后发表回答