Проверка доступности хоста
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.140] |
|
|
Проверка доступности хоста
|
Сообщ.
#1
,
|
|
|
|
Есть ли какая асинхронная функция проверки доступности удаленного хоста по его api?
|
|
Сообщ.
#2
,
|
|
|
|
Нету такого понятия, как api хоста. Удаленный хост может выполнять какую-то серверную функцию. Тогда его доступностью можно считать возможность подключения к серверному порту или выполнения какого-то запроса по соответствующему серверному протоколу. Опять же, надо понимать, что путь к удаленному хосту проходит через ряд маршрутизаторов, и невозможность подключения к нему из одной сети не означает, что хост не доступен из других.
|
|
Сообщ.
#3
,
|
|
|
|
connect на 80й порт и/или 443й если речь про вебсервер идет
еще ping но тут без гарантии - могут игнорироваться запросы и не слаться ответы. если админ затейник то хост может быть но из вне никак про это не узнать |
|
Сообщ.
#4
,
|
|
|
|
Соглашусь с UncleBob. Более того, та сторона может игнорить все запросы, несовпадающие с заданным образцом (если используется UDP или иной connectionless-протокол), дропать ping и прочие ICMP-вещи, т.е. выглядеть как отсутствующая ровно до тех пор как угадаешь с форматом.
Поэтому, надо бы больше деталей: какая задача решается? в каком контексте нужна проверка доступности? |
|
Сообщ.
#5
,
|
|
|
|
xbarmaglot
объясни на пальцах чего надо, а то мужики здесь битву экстрасенсов устроили. |
|
Сообщ.
#6
,
|
|
|
|
Банальная задача: пропинговать хост. Только асинхронно.
P.S. Есть железяка. Она может быть выдернута из сети. Нужно периодически ее опрашивать и понимать жива она или нет. Примеры из WinAPI синхроннве. Но это занимает много времени. Заводить отдельные потоки на несколько устройств крутовато... Нужно их периодически опрашивать и понимать отвалились ли они или нет. Поэтому хотелось бы асинхронных вызовов... |
|
Сообщ.
#7
,
|
|
|
|
Что на железке крутится? Какой софт, какая ось? Можно ли как-то администрировать?
|
|
Сообщ.
#8
,
|
|
|
|
Mr.Delphist
в данном случае абсолютно плевать какая там железка. Есть винда собственно, и в ней должен быть имплементирован код. Есть туева хуча примеров пинга на рав сокетах. Но они блокирующие. Это правда. Автор спрашивает как сделать их неблокирующими, собственно весь гамуз. |
|
Сообщ.
#9
,
|
|
|
|
Насколько я понял, автору не с железки надо пинговать, а железку
![]() Пинг в потоке- не вижу криминала кстати, в любом случае он завершится через несколько секунд либо по приему ответа на пинг, либо по таймауту, сожрав ноль целых хрен десятых системных рксурсов |
|
Сообщ.
#10
,
|
|
|
|
Запустить ping.exe как дочерний процесс, его вывод направить к себе и парсить.
Ну и да, запускать это вовсе не обязательно в основном потоке - вполне будет жить и через дополнительный. |
|
Сообщ.
#11
,
|
|
|
|
Цитата xbarmaglot @ Банальная задача: пропинговать хост. Только асинхронно.P.S. Есть железяка. Она может быть выдернута из сети. Нужно периодически ее опрашивать и понимать жива она или нет.Примеры из WinAPI синхроннве. Но это занимает много времени. Заводить отдельные потоки на несколько устройств крутовато...Нужно их периодически опрашивать и понимать отвалились ли они или нет. Поэтому хотелось бы асинхронных вызовов... Об асинхронных (неблокируемых) сокетах автор знает? Если необходим именно ping, т.е. ICMP то также делаешь неблокируемый сокет и все дела. |
|
Сообщ.
#12
,
|
|
|
|
Цитата Цитата (neokoder @ 44 минуты назад) Об асинхронных (неблокируемых) сокетах автор знает? Если необходим именно ping, т.е. ICMP то также делаешь неблокируемый сокет и все дела. Что-то я не до конца видимо понимаю... ![]() В описании этой функции IcmpSendEcho2 открытым текстом указан T-OUT. Это означает, что сокеты используются не блокирующие. --- Дело в другом - принципиальной необходимости ждать ответа на пакет в течении некоторого времени. |
|
Сообщ.
#13
,
|
|
|
|
Цитата neokoder @ Об асинхронных (неблокируемых) сокетах автор знает? По большому счету асинхронные и неблокирующие сокеты - это несколько разные вещи. |
|
Сообщ.
#14
,
|
|
|
|
Цитата ЫукпШ @ В описании этой функции IcmpSendEcho2 открытым текстом указан T-OUT. Что такое T-OUT и где он указан? Добавлено Цитата Oleg2004 @ По большому счету асинхронные и неблокирующие сокеты - это несколько разные вещи. В чём разные? Одно и тоже просто по-разному названо. Кто понимает о чём речь разницы между двумя этими понятиями в данном контексте этой темы делать не будет. Автор топика использовал слово асинхронно я его повторил, чтобы ему было понятнее. Но привёл также и второе название в принципе более правильное. Добавлено Цитата ЫукпШ @ Дело в другом - принципиальной необходимости ждать ответа на пакет в течении некоторого времени. Ну так можно в 10 потоках ждать, если опрос 10 хостов, а можно и в одном все 10 запрjосов. Есть же разница, правильно? |
|
Сообщ.
#15
,
|
|
|
|
Цитата neokoder @ В чём разные? Одно и тоже просто по-разному названо. Ну, начнем с того, что синхронных или блокирующих, или асинхронных сокетов - как таковых - не существует в природе. Сокет - в терминологии *nix - это в некотором виде файл - для чтения/записи. Файлов синхронных-асинхронных не бывает. И хотя такое название - блокирующий неблокирующий асинхронный - и применяется в сленге - на самом деле это неточность, вошедшая в привычку. Так просто проще говорить-писать ![]() Синхронной, неблокирующей или асинхронной - бывает только операция ввода/вывода, которая выполняется с данным сокетом. Так вот, блокирующая и неблокирующая операции выполняются с помощью одних и тех же блокирующих функций, например connect(), только при неблокирующей операции функция выполняется: а) в несвойственной для нее обстановке, что обязательно фиксируется передачей управления в программу с помощью возврата с ошибкой (причем конкретной для данной функции)! б)основная программа таким или иным образом сама ответственна за опрос результата исполнения По сути в основных ОС нет асинхронных функций, выполняющихся на сокете. И асинхронный сокет на самом деле это "псевдо асинхронный сокет" Например в Windows реальными асинхронными функциями являются только функции работы с сетевыми базами данных WSAAsyncGetXbyY, которые к сокетам никаким боком. Ну вот где-то так |
|
Сообщ.
#16
,
|
|
|
|
Цитата neokoder @ Ну так можно в 10 потоках ждать, если опрос 10 хостов, а можно и в одном все 10 запрjосов. Есть же разница, правильно? ![]() От реализации зависит. Для данного случая - возможно, что и нет разницы. --- xbarmaglot упомянул о "своих" железках. Это значит, что реализовывать ping вовсе не обязательно. Можно организовать обмен пакетами - например, UDP. И слать в пакете не просто эхо. Гораздо полезнее слать статус. Кроме того, можно предусмотреть переключаемое состояние "железки", при котором она сама (без запроса) раз в указанный период генерит пакет типа "я тута". При таких обстоятельствах особая производительность при приёме не нужна. И без отдельного потока тоже вполне можно обойтись. И без сырых сокетов тоже. --- Время от времени нужно опрашивать статус сокета селектом и читать по мере необходимости. Несколько раз подряд не пришла квитанция от какой-либо "железки" - это значит, её нет. |