У меня есть некоторый существующий 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().