Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как по IP-адресу получить имя компьютера в локальной сети? [D6, NT4, Win2k, WinXP]


Страницы:   1 2

Sour Smile ©   (2005-05-23 11:07:00) 

Как по IP-адресу получить имя компьютера в локальнойсети?
До недавного времени, для этих целей я использовал функцию IPToHostиз http://delphibase.spb.ru/?action=viewfunc&topic=vclservice&id=10277, но у неё неожиданно оказался один недостаток: если у пользователя интернет в дауне, то эта функция замирает секунд на 10-15. Я так понимаю, что эта функция сначала пытается выяснить имя хоста в интернете, а потом уже в локальной сети. Для моих целей это слишком большая пауза... Может есть какой нибудь другой способ?

ps. Само собой вариант, когда у пользователя нужно изменять какие либо настройки не подходит.


Sour Smile   (2005-05-23 17:49:00) [1]

Ладно, не морочьте себе голову. Я пошёл другим путём:
Сначала функцией NetServerEnumполучаю список доменов в сети (у нас их три), потом для каждого домена, опять же функцией NetServerEnumполучаю список компьютеров в каждом домене (который сохраняю в массив), после этого для каждого компьтера получаю его IP-адрес функцией HostToIPиз http://delphibase.spb.ru/?action=viewfunc&topic=netaddress&id=10119и сохраняю в тот же массив рядом с именем компьютера. В последствии, когда нужно будет узнать имя компа по IP быстренько прохожусь по списку и готово.

ps. Правда всё равно осталось несколько проблемочек (у компьютера изменился IP-адрес, в массиве не оказалось требуемого IP и т.д.), но их уже относительно просто обойти (чаще обновлять массив, при отсутствии IP в массиве - насильно обновить список (это правда займёт некоторое время, но всего один раз, а не каждый раз(!) как в случае с IPToHost))


False_Delirium,   (2005-05-23 16:56:00) [2]

Digitman ©   (23.05.05 16:44) [23]
Согласен.

Он так же програмно может посмотреть в настройках потокола ОС первичный и вторичный DNS.


Digitman   (2005-05-23 16:44:00) [3]


> False_Delirium ©   (23.05.05 16:36) [22]


ну, предположим, автор таки знает наперед (устроил сисадмину пытку апельсинами и паяльником) адреса dns-серверов в ЛВС ..

тогда задача программной модификации списка вполне осуществима ..


False_Delirium   (2005-05-23 16:36:00) [4]

Друг с другом

"в кр.случае реконфигурация сет.настроек в тех или иных пределах м.б. выполнена и тобой самим, т.е. программно .. в т.ч. - установка списка адресов dns-серверов и их приоритетов"

"...для начала нужно знать адрес хоста, где потенциально активен осн. dns-сервер домена .. ты его заранее знаешь ? нет, не знаешь..."


Или он знает список dns-серверов или нет. Второй пост нивелирует первый.


Digitman   (2005-05-23 16:30:00) [5]


> Проблема советов несовместимость


несовместимость чего с чем ?


False_Dleirium   (2005-05-23 16:28:00) [6]

Sour Smile   (23.05.05 16:10) [16]
Проблема же не в том, что приложение зависает

Отдельный поток ни коим образом не ускорит получение результата. Кроме того для WSAAsyncGetHostByAddr никаких потоков не надо, она уже асинхронная.

Для WSAAsyncGetHostByAddr не нужен, если по каким-то причинам приложение зависает, то в отдельный поток, к тому и написано.
Ты написал, что приложение зависает: может быть ты собственноручно дожидаешься ответа.

> Можешь пытаться проверить на доступность основной ДНС сервер,
> после чего посылать запрос.
Здесь пожалуйста подробнее - каким образом ускорится результат от того, что я проверю на доступность основной ДНС сервер?


Это написано не к увеличению скорости, а к "а в том что результатов функции приходится долго ждать, если Интернет  в дауне"или это под твои ником запостил кто-то ?

Скорость будет ограничена скоростью ответа от сервера, у себя ты можешь только "сгладить" или предусмотреть в случае недоступности ДНС сервера.

Digitman ©   (23.05.05 16:18) [17]

в кр.случае реконфигурация сет.настроек в тех или иных пределах м.б. выполнена и тобой самим, т.е. программно .. в т.ч. - установка списка адресов dns-серверов и их приоритетов

для начала нужно знать адрес хоста, где потенциально активен осн. dns-сервер домена .. ты его заранее знаешь ? нет, не знаешь... а уж юзер и словов таких не слышал "основной dns-сервер")

Проблема советов несовместимость )


Digitman   (2005-05-23 16:26:00) [7]

пардон, имелась ввиду wsaasyncgethostbyaddr

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsaasyncgethostbyaddr_2.asp


Sour Smile   (2005-05-23 16:19:00) [8]


> Digitman ©   (23.05.05 16:02) [15]
> > WSAAsyncGetHostName такой функции не нашёл
> она в составе Winsock2
> все подробности есть как минимум в первоисточнике - msdn
msdn это которая http://msdn.microsoft.com/? Там тоже такая функция не описана:
Results for: WSAAsyncGetHostName
Sorry, no results were found.


Digitman   (2005-05-23 16:18:00) [9]


> каким образом ускорится результат от того, что я проверю
> на доступность основной ДНС сервер?


для начала нужно знать адрес хоста, где потенциально активен осн. dns-сервер домена .. ты его заранее знаешь ? нет, не знаешь... а уж юзер и словов таких не слышал "основной dns-сервер")

а "ускорение результата" объясняется достаточно просто - запросы клиента на резрешение адреса в имя хоста обрабатываются сервером в той же ЛВС, и этот сервер обязанзнать имена хостов, зарегистированных в домене


Sour Smile   (2005-05-23 16:10:00) [10]


> False_Delirium ©   (23.05.05 15:57) [13]
> Sour Smile   (23.05.05 15:28) [10]
> Проблема же не в том, что приложение зависает, а в том что
> результатов функции приходится долго ждать, если интернет
> в дауне...
> В отдельный поток.
Отдельный поток ни коим образом не ускорит получение результата. Кроме того для WSAAsyncGetHostByAddr никаких потоков ненадо, она уже асинхронная.

> Можешь пытаться проверить на доступность основной ДНС сервер,
> после чего посылать запрос.
Здесь пожалуйста подробнее - каким образом ускорится результат от того, что я проверю на доступность основной ДНС сервер?


Digitman   (2005-05-23 16:02:00) [11]


> WSAAsyncGetHostName такой функции не нашёл


она в составе Winsock2

все подробности есть как минимум в первоисточнике - msdn

асинхронные запросы (WSAAsyncХХХХХХХХХ) всегда можно отменить


Digitman   (2005-05-23 16:00:00) [12]


> Не могу же я от всех требовать


не только можешь, но и должен !
и не от всех, а от сисадмина, в задачи которого по идее должна входить настройка/конфигурирование раб.станций для успешного выполнения тех или иных задач, в т.ч. твоей

в кр.случае реконфигурация сет.настроек в тех или иных пределах м.б. выполнена и тобой самим, т.е. программно .. в т.ч. - установка списка адресов dns-серверов и их приоритетов


False_Delirium   (2005-05-23 15:57:00) [13]

Sour Smile   (23.05.05 15:28) [10]

Проблема же не в том, что приложение зависает, а в том что результатов функции приходится долго ждать, если интернет в дауне...

В отдельный поток.

Если интернет в дауне, если ... если ... если ...
Этих "если" очень много, из ты можешь предусмотреть у себя.
Можешь пытаться проверить на доступность основной ДНС сервер, после чего посылать запрос.

И ничего тебе не мешает организовать свой таймаут.

+

If the operation was successfully initiated, WSAAsyncGetHostByAddr returns a nonzero value of type HANDLE which is the asynchronous task handle (not to be confused with a Windows HTASK) for the request. This value can be used in two ways. It can be used to cancel the operation using WSACancelAsyncRequest. It can also be used to match up asynchronous operations and completion messages, by examining the wParam message argument.


Sour Smile   (2005-05-23 15:53:00) [14]


> Eraser ©   (23.05.05 15:31) [11]
> Тут нужно отконфигуировать последовательность опроса DNS
> сереров.

:)))
А вот здесь вступает в силу постскриптум из моего вопроса. :)

Не могу же я от всех требовать, что-бы у них было " всё настроено так, а не иначе, в противном случае моё приложение будет работать не подобающим образом"


Eraser   (2005-05-23 15:31:00) [15]

Sour Smile
Проблема же не в том, что приложение зависает, а в том что результатов функции приходится долго ждать, если интернет в дауне...


Тут нужно отконфигуировать последовательность опроса DNS сереров.


Sour Smile   (2005-05-23 15:28:00) [16]


> False_Delirium ©   (23.05.05 14:47) [9]
> Опечатался человек, мог бы и сам найти.
> WSAAsyncGetHostByAddr

Мдааа... Нет, эту функцию я и сам нашёл, только чем же эта функция быстрее, чем IPToHostиз http://delphibase.spb.ru/?action=viewfunc&topic=vclservice&id=10277?

Проблема же не в том, что приложение зависает, а в том что результатов функции приходится долго ждать, если интернет в дауне...


False_Delirium   (2005-05-23 14:47:00) [17]

Опечатался человек, мог бы и сам найти.

WSAAsyncGetHostByAddr


Sour Smile   (2005-05-23 14:31:00) [18]


> Digitman ©   (23.05.05 12:48) [7]
> в этом случае "именем компьютера" будет имя хоста в домене
> имя хоста резольвится обычным образом - [WSAAsync]GetHostName

Прости, что-то несовсем понятно:
GetHostName(из модуля WinSock.pas) возвращает имя локального компьютера (хоста?)
WSAAsyncGetHostNameтакой функции не нашёл... (даже в http://google.com :))


Digitman   (2005-05-23 12:48:00) [19]

в этом случае "именем компьютера" будет имя хоста в домене
имя хоста резольвится обычным образом - [WSAAsync]GetHostName
порядок просмотра DNS-серверов будет таким каким он указан в DNS-настройках ТСР-протокола, привязанному к соотв.интерфейсу


Sour Smile   (2005-05-23 12:11:00) [20]


> Digitman ©   (23.05.05 12:02) [5]
> а как идентифицирован этот компьютер в ЛВС ?
> как член рабочей группы ? как член домена ?

Как член домена.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо