2009-08-07 3 views
0

Когда программа запускается через FastCGI, это exec'd с уже открытым разъемом, чтобы поговорить с веб-сервером. Номер дескриптора файла сокета передается программе, но как его можно преобразовать в что-то полезное на Java, например, в экземпляр Socket?Могу ли я получить Java Socket из номера дескриптора файла?

В моей службе хостинга используется mod_fastcgi для Apache httpd. Они не позволят мне настроить внешний сервер, на котором я предоставляю хост: порт для пересылки запросов через FastCgiExternalServer.

ответ

1

Вы не можете делать это юридически. Тем не менее, вы можете сделать такой взлом (не пытайтесь это делать дома). Вы можете читать от is и писать до 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); 
+0

Мне понадобится немного времени, чтобы связать это с библиотекой разбора сообщений библиотеки разработчиков FCGI, но это похоже на путь. Благодарю. –

+0

Работает ли этот хак для TCP и UDP? –

1

Для чего нужен Socket? Единственными полезными методами в сокете являются getInputStream и getOutputStream, но если вы работаете как CGI, у вас уже есть такие: они называются System.in и System.out. :)

+2

Потому что это не так, как работает FastCGI, что знал OP, поэтому он задал вопрос, который он задал. – skaffman

+0

Любая документация, которую я могу найти, говорит мне, что общение осуществляется с помощью 'System.in' и' System.out', поэтому мой первоначальный вопрос все еще стоит. – Bombe

+0

(я говорю о документации по адресу http://www.fastcgi.com/devkit/doc/fcgi-java.htm, которая выглядит для меня «официальной».) – Bombe

Смежные вопросы