2009-08-07 5 views
0

프로그램이 FastCGI를 통해 시작되면 웹 서버와 통신하기 위해 소켓이 이미 열려있는 상태에서 실행됩니다. 소켓의 파일 디스크립터 번호가 프로그램에 전달되지만 소켓 인스턴스와 같이 Java에서 유용하게 사용할 수있는 방법으로 변환 할 수 있습니까?파일 설명자 번호에서 Java 소켓을 가져올 수 있습니까?

내 호스팅 서비스는 Apache httpd 용 mod_fastcgi를 사용합니다. 그들은 FastCgiExternalServer를 통해 요청을 전달하기 위해 host : port를 제공하는 외부 서버를 구성 할 수 없습니다.

답변

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? 소켓의 유일한 유용한 메소드는 getInputStreamgetOutputStream이지만 CGI로 실행중인 경우 이미 System.inSystem.out이라고하는 코드가 있습니다. :)

+2

이것이 OP가 알고있는 FastCGI의 작동 방식이 아니기 때문에 그가 질문 한 이유입니다. – skaffman

+0

필자가 찾을 수있는 문서는'System.in'과'System.out'으로 통신이 이루어 졌기 때문에 원래의 질문은 여전히 ​​유효하다는 것을 알 수 있습니다. – Bombe

+0

(http://www.fastcgi.com/devkit/doc/fcgi-java.htm에서 나에게 상당히 "공식적인"것으로 보이는 문서에 대해 이야기하고 있습니다.) – Bombe

관련 문제