2010-07-07 2 views
1

C++ 응용 프로그램에서 만든 기본 winsock 소켓을 java.net.Socket을 사용하여 서버에 연결하는 라이브러리에 전달해야합니다. 이 winsock appication은 이미 소켓 연결을 처리합니다. 어떻게 java.net.Socket의 소켓 디스크립터를 명시 적으로 설정할 수 있습니까?Java 소켓에 기본 winsock 소켓 전달

+0

당신은 무엇을해야합니까? –

+0

이 원시 소켓은 특수한 하드웨어 드라이버에 묶여 있습니다. – ApriOri

+0

C에서 래퍼 모듈을 만든 다음 JNI를 사용하여 액세스하는 것이 좋습니다. –

답변

1

유닉스에서 이와 같은 문제가 발생했습니다. 동일한 메커니즘이 WinSock에서 작동하는지 확실하지 않습니다.

우리의 경우 C 프로그램은 특수 하드웨어를 사용하여 소켓을 만듭니다. C 프로그램은 Java 프로그램이 소켓을 전달 함을 나타냅니다. 그런 다음 Java 프로그램은 소켓의 파일 설명자로부터 입출력 스트림을 구성하여 일반 소켓처럼 읽기/쓰기가 가능합니다.

자바 코드가 여기에있다,

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

멋지다. Java 소켓을 제공하고 입/출력 스트림을 제공해야하므로 앞으로 한 걸음 더 앞으로 나아갈 필요가있다. – ApriOri