2010-10-04 2 views
11

У меня есть некоторый существующий код C, который использует несовместные сокеты ICMP для выполнения Ping, и мне нужно использовать этот код в Java, поскольку Java не поддерживает пакеты ICMP. Когда я завершаю код в JNI и вызываю его, код C не может получить сокет при выполнении:Лучший способ сделать программирование сокетов RAW с использованием Java

гнездо (AF_INET, SOCK_RAW, 1);

Я предполагаю, что Java сбросила некоторые привилегии, которые запрещают использование raw-сокета из процесса Java. Это я должен найти решение.

Я наблюдал следующее:

  • Если я пишу программу, C и называем, что из Java с помощью среды выполнения раздвоенного кода может открыть сокет.
  • Если я запустил этот родной код из Eclipse, он также хорошо работает. Я предполагаю, что это происходит из-за того, что Eclipse был запущен из eclipse.exe, а не из java.exe.

Это означает, что я мог бы решить свою проблему, выбрав одну из этих двух стратегий, но мне тоже не нравится. Есть ли другие способы, с помощью которых я мог бы заставить Java принять, что код JNI открывает этот сокет?

Редактировать: Чем больше я занимаюсь этой проблемой, тем больше я считаю, что проблема связана с Windows 7 с тем, как запускается Java.

Также представляется, что если вы заработаете окна или работаете на какой-либо другой платформе, кроме Windows, можно использовать метод InetAddress.isReachable().

ответ

5

Может быть, использовать существующий Java-родной сокет lib? Тогда вам не придется беспокоиться о кодировании JNI lib.

См: http://www.savarese.com/software/rocksaw/

+0

Эта библиотека отлично смотрится. Это хотя и то же, что и наш собственный код, поэтому моя проблема должна быть связана с окнами. – Knubo

+0

Да, я нахожу, что писать библиотеки JNI будет немного больно. Поэтому, когда вы сомневаетесь, используйте то, что уже существует. Получили ли вы эту библиотеку для работы с Windows 7 или она не работает? – Andy

+0

Мы решили пойти с Runtime.exec(), поскольку мы должны решить его и продолжать двигаться вперед. Я думаю, что ваш ответ является лучшим из них до сих пор, и он должен действительно решить мой вопрос, хотя не моя проблема, поэтому я буду принимать его :) – Knubo

0

Вы могли бы также попробовать метод java.net.InetAddress.isReachable(), это доступно от J2SE5 года.

Но в Windows это не работает. См .: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html

+0

Этот метод не подходит для использования, который нам нужно сделать, и мы также нуждаемся в нем для работы с Windows. – Knubo

+1

Этот метод работает правильно, только когда у вас есть разрешение учетной записи root - он отправляет необработанный запрос ICMP ECHO в таком случае, в противном случае он пытается установить TCP-соединение на порте 7 (служба эхо-сигнала), который не всегда открыт. Поэтому в некоторых случаях он не будет работать, когда Java не запускается из учетной записи root. –

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