Лучший способ программирования RAW-сокетов с использованием Java

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

(AF_INET, SOCK_RAW, 1);

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

Я заметил следующее:

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

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

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

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

Ответ 1

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

Смотрите: http://www.savarese.com/software/rocksaw/