Как проверить, существует компьютер или нет? - PullRequest
1 голос
/ 28 октября 2009

Я написал небольшую программу, которая работает как команда ping (я использую ICMPSendEcho2), но она возвращает возвращаемое значение, а не только текстовое сообщение. Теперь у меня есть только один вопрос. Как программно проверить, существует имя хоста или нет? Я имею в виду, что если я хочу пропинговать компьютер A, а у меня даже нет компьютера A, то он должен сказать то, что первоначально говорит: «Запрос пинга не может найти хост ...». Это означает, что нет компьютера с таким именем. Но если я пингую computerB (когда он выключен) своим пингом, то он говорит, что Хост не найден. Итак, мой вопрос: как я могу решить, что компьютер не существует или он только выключен?

Заранее спасибо!

Kampi

Ответы [ 5 ]

3 голосов
/ 28 октября 2009

Как проверить, существует компьютер или нет?

Эта проблема не имеет решения. Вы просто не можете точно различить компьютер, который не существует в настоящее время, и компьютер, который существует, но вы не можете «пинговать».

DNS не помогает, потому что он говорит только о наличии связи между IP-адресом и DNS-именем. Он не сообщает вам, есть ли в данный момент машина, связанная с этим IP-адресом.

Протокол ARP низкого уровня и протоколы маршрутизации также не помогают. Они позволяют вам (или, более вероятно, вашей ОС) отправлять сетевые пакеты в (номинально) правильное место, но они не / не могут сказать вам, если что-то прослушивается в данный момент. Сетевой кабель компьютера мог быть просто отключен, компьютер мог быть отключен (но, конечно, все еще существует), или он мог быть просто поражен метеоритом.

И я даже не упомянул, что существуют вещи, называемые брандмауэрами, которые часто активно пытаются помешать вам узнать, что существуют определенные машины.

И есть случай, когда машина жива и использует IP-адрес, но IP-адрес не зарегистрирован в DNS.


Как программно проверить, существует имя хоста или нет?

Это другой вопрос. Имя хоста и компьютер - это не одно и то же по ряду причин.

Теперь выполнение DNS-запроса (обычно) даст вам ответ, который говорит , что имя хоста существует или не существует, но вам все равно нужно быть осторожным при интерпретации этого ответа.

  • Если DNS сообщает , что имя хоста "foo.bar.xyzzy.com" существует, это не означает, что в данный момент существует компьютер (или любой другой отвечающий объект), связанный с это имя, или что когда-либо было или будет. Он может просто отвечать информацией, которая не соответствует действительности.

  • Если DNS сообщает , что имя хоста "foo.bar.xyzzy.com" не существует, это может альтернативно означать:

    • сбой внешней сети или ошибка конфигурации DNS-сервера привели к неверному результату DNS,
    • Конфигурирующие устройства вашей машины "решателя" сказали ему, что он должен общаться со службой DNS, которая не знает (скажем) о TLD ".com".
    • ваша машина общается с подорванным DNS; например думаю DNS Switcher !!
    • авторитетный DNS-сервер скрывает существование имени машины; например по соображениям безопасности
    • кто-то отключил внешний доступ на основе имени для машины, временно удалив его DNS-запись в источнике; например в то время как они делают некоторое обслуживание.

    Другими словами, имя хоста все еще может существовать в значимом смысле, несмотря на то, что говорит ответ DNS.

Короче говоря, вы не можете вывести какие-либо факты о реальном мире со 100% уверенностью из ответа DNS. Наиболее простая и точная интерпретация, которую вы можете дать нетехническому пользователю, если (скажем) DNSQuery возвращает 9003 что-то вроде:

The name 'foo.bar.xyzzy.com' cannot be resolved to a computer at this time
2 голосов
/ 20 ноября 2009

Это намного проще, чем я думал! Мне нужно только вызвать функцию DNSQuery, и если это не удастся с ошибкой 9003 (что означает, что DNS-имя не существует), чем у меня есть то, что я хотел:)

Спасибо за помощь всем!

Kampi

1 голос
/ 28 октября 2009

Вы можете использовать разрешение имен DNS, чтобы определить, был ли когда-либо в прошлом зарегистрирован компьютер с данным именем хоста. Это подразумевает, но не обязательно означает, что машина существует прямо сейчас.

То же самое верно для любого разрешения имен или службы каталогов.

0 голосов
/ 28 октября 2009

Единственное несоответствие между этими двумя случаями, о котором я могу подумать, заключается в том, что когда компьютер выключен, но не отвечает, он должен быть разрешен с помощью некоторой системы разрешения имен (netbios, dns и т. Д.).

Если это так, вы должны попытаться сначала разрешить имя хоста, используя gethostbyname.

0 голосов
/ 28 октября 2009

Если имя хоста вообще не существует, вы должны получить ошибку распознавателя DNS при попытке разрешить хост. Это отличается от получения ошибки после проверки связи с известным хостом, который оказывается выключенным / неисправным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...