У меня есть некоторый существующий код 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().
Эта библиотека отлично смотрится. Это хотя и то же, что и наш собственный код, поэтому моя проблема должна быть связана с окнами. – Knubo
Да, я нахожу, что писать библиотеки JNI будет немного больно. Поэтому, когда вы сомневаетесь, используйте то, что уже существует. Получили ли вы эту библиотеку для работы с Windows 7 или она не работает? – Andy
Мы решили пойти с Runtime.exec(), поскольку мы должны решить его и продолжать двигаться вперед. Я думаю, что ваш ответ является лучшим из них до сих пор, и он должен действительно решить мой вопрос, хотя не моя проблема, поэтому я буду принимать его :) – Knubo