2010-07-07 1 views
1

Мне нужно передать собственный сокет winsock, созданный приложением C++, в библиотеку моего приложения, которое использует java.net.Socket для подключения к серверу. Эта аппликация winsock уже заботится о подключении сокета. Как я могу явно указать дескриптор сокета java.net.Socket?Передача родного winsock-сокета в java-сокет

+0

Что вам нужно? –

+0

Этот родной сокет привязан к специальному аппаратным драйверам. – ApriOri

+0

Я бы рекомендовал создать модуль-оболочку на C, а затем использовать JNI для доступа к этому. –

ответ

1

Я столкнулся с такой проблемой в Unix, не уверен, что тот же механизм работает с вами в WinSock.

В нашем случае программа на C создает сокет с использованием специального оборудования. Программа C запускает программу Java, которая передает ей сокет. Затем программа 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

Thats nice, мне просто нужен еще один шаг вперед, поскольку я должен предоставить java-сокет, а не потоки ввода-вывода. – ApriOri