AlexXYZ
@AlexXYZ
O Keep Clear O

Как определить имя компьютера по IP-адресу?

У меня в домене есть "плавающий" ip, который статически может быть назначен одному любому компу в локальной сети. Это делается по служебной необходимости. Делается это руками. Написал программу-"датчик", которая пингует этот адрес и в трее показывает, занят этот адрес или нет (как светофор - зелёный - не занят, красный - занят). Этот адрес всегда назначается только компьютеру. Соответственно у компьютера есть имя, которое я хочу определить и вывести в tooltip, чтобы можно было навести и посмотреть - у кого этот адрес. Нашёл, что существует несколько способов определения имени компа, например:

Dns.GetHostEntry

[DllImport("Netapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
public extern static IntPtr NetWkstaGetInfo(string servername, int level, ref IntPtr bufptr);

[DllImport("IpHlpApi.dll")]
[return: MarshalAs(UnmanagedType.U4)]
static extern int GetIpNetTable(IntPtr pIpNetTable, [MarshalAs(UnmanagedType.U4)] ref int pdwSize, bool bOrder);

Но так же пишут, что эти методы не дают 100% результата определения имени компьютера по ip. Поэтому этими методы я перебираю по очереди, когда предыдущий метод не смог определить имя компьютера. Но всё равно бывают ситуации, когда ни один из методов не определил имя компьютера. И я бы сильно по этому поводу не переживал, если бы только не программа

nbtstat -a [ip]

которая всегда находит правильное имя компа, когда мои методы не дают результата. Не подскажите, чем бы ещё воспользоваться? Функция или библиотека какая-нибудь (запуск nbtstat - не предлагать).
  • Вопрос задан
  • 18362 просмотра
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
В одноранговой сети при включении компьютер отсылает широковещательный запрос по UDP (137-139,445 порты), оповещая всех, что он включился. Те ему отвечают у кого какой IP.
Слушайте широковещательный пакет и будет вам счастье, также можете попросить другие компы откликнуться послав широковещательный запрос.
Ответ написан
@uyrij
Возможно не понял сути вашего вопроса,
Если в сети есть netbios, то достаточно
под виндой
ping -a "проверяемый IP"

под линукс
host "проверяемый IP"
Ответ написан
microphone
@microphone
Сломалось - читай логи!
Имя компухтера передается двумя протоколами: SMB и DNS. Изучив их принцип будет достаточным для понимания сути вашего вопроса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы