2016-03-30 3 views
4

Мое приложение должно выполнить ping много IP-адресов сразу за скорость выполнения кода. Например, pinging 300 ip-адресов, что тайм-аут через одну секунду займет 5 минут, тогда как если 20 запущено за один раз, это займет около 15 секунд.Как я могу отправить несколько пинов одновременно с помощью Java на Windows без использования ping.exe?

Я попытался вызвать windows ping.exe для этого, но у меня были две отдельные и подобные проблемы. Одна из проблем заключается в том, что на некоторых машинах Windows пинг будет просто зависеть на минутку, по-видимому, без причины, пока я не убью нить, и она умрет. Другая проблема: у нас был ping.exe, который полностью разбился на машины раньше, где любой вызов ping.exe длится вечно, поэтому сотни процессов ping.exe начинают накапливаться до тех пор, пока машина не выйдет из строя, и запустить ping.exe вручную из команды линия в этом случае просто оставит еще один процесс ping вечно.

Я попытался использовать библиотеку под названием icmp4j, но эта библиотека позволяет только один пинг одновременно в Windows.

Я пробовал это person's code и в итоге столкнулся с проблемами в моей локальной сети. При проверке локального адреса, который не существует (в вашей подсети), видимо, вы можете получить ответ, в котором говорится, что адрес недоступен. На ровно 50% этих ответов я получаю тайм-аут, а с другой стороны 50% получаю «неподходящий».

Кто-нибудь знает метод одновременного запуска множества пингов на окнах без использования icmp4j или ping.exe?

+1

Возможный дубликат [код java для ping IP-адреса] (http://stackoverflow.com/questions/11506321/java-code-to-ping-an-ip-address) – Tim

+0

Посмотрите: http: //stackoverflow.com/questions/3584210/preferred-java-way-to-ping-a-http-url-for-availability –

+0

@JohnKane \t Это не сработает, потому что мне действительно нужно выполнить ICMP-пинг, а не соединение сокета. – Jdban101

ответ

1

InetAddress.isReachable() - инструмент для голых костей, который вам нужен.

icmp4j должен выполнять эту работу просто отлично, так как это всего лишь обертка вокруг isReachable. Возможно, вы не можете использовать статическую точку входа IcmpPingUtil.executePingRequest(), хотя быстрый обзор кода не выглядит ужасно тревожным. Если вы пройдете через код в этом методе (NativeBridge или JavaNativeBridge, IcmPingRequest и IcmpPingResponse должно быть достаточно), тогда вы должны будете создать надежный класс потокобезопасности, который может делать то, что вам нужно.

+0

'InetAddress.isReachable()' при использовании с окнами на самом деле не ping. Он пытается установить TCP-соединение с портом 7, чтобы узнать, получил ли он ответ. http://stackoverflow.com/questions/11587271/isreachable-always-returning-true-regardless-of-what-the-ip-address-is Комментарий в файле 'WindowsNativeBridge.java' заставляет меня думать, что копирование из он будет иметь такую ​​же проблему: _WARNING: этот метод синхронизирован, потому что, если несколько потоков вызывают IcmpLibrary.IcmpSendEcho(), тогда результаты повреждаются !!! Так что пока у нас нет другого выбора, кроме как выяснить, как вызвать IcmpSendEcho2 или вызвать ping.exe_ – Jdban101

+1

Что меня беспокоит, их комментарий в том, что он дает мне что-то попробовать, но это не обязательно означает, что он будет работать и его сложно. – Jdban101

+0

Вам нужен ответ, чтобы он не был поврежден? Если вам просто нужен ping для ping и вам не нужен доступ к значениям в ответе ICMP, тогда он может быть достаточно хорош для ваших нужд. ( В качестве альтернативы, обновление до linux) –

 Смежные вопросы

  • Нет связанных вопросов^_^