Лучший способ для программирования сокетов RAW с использованием Java
У меня есть некоторый существующий код C, который использует необработанные сокеты ICMP для выполнения Ping, и мне нужно использовать этот код в Java, поскольку Java не поддерживает пакеты ICMP. Когда я оборачиваю код в JNI и вызываю его, код C не может получить сокет при выполнении:
сокет (AF_INET, SOCK_RAW, 1);
Я предполагаю, что Java упустила некоторые привилегии, которые отключают использование необработанного сокета из процесса Java. Это я должен найти решение.
Я заметил следующее:
- Если я напишу программу на C и вызову ее из Java, используя Runtime, разветвленный код может открыть сокет.
- Если я запускаю этот нативный код из Eclipse, он тоже работает хорошо. Я предполагаю, что это происходит из-за того, что Eclipse был запущен из eclipse.exe, а не из java.exe.
Это означает, что я мог решить свою проблему, выбрав одну из этих двух стратегий, но мне не нравится ни одна. Есть ли другие способы, которыми я мог бы заставить Java признать, что код JNI открывает этот сокет?
Изменить: Чем больше я смотрю на эту проблему, я думаю, что это должно быть связано с Windows 7 с тем, как Java запускается.
Также кажется, что если вы заставляете окна вести себя или если вы находитесь на какой-то другой платформе, отличной от Windows, метод InetAddress.isReachable() также может быть использован.
2 ответа
Может быть, использовать существующий Java родной сокет lib? Тогда вам не нужно беспокоиться о кодировании библиотеки JNI.
Вы могли бы также попробовать java.net.InetAddress.isReachable()
метод, это доступно с J2SE5 и далее.
Но это не работает, как ожидалось в Windows. См.: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html