Лучший способ для программирования сокетов 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.

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

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

Но это не работает, как ожидалось в Windows. См.: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html

Другие вопросы по тегам