У меня в домене есть "плавающий" 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 - не предлагать).
Если не секрет - почему не предлагать nbtstat? Создал процесс, переопределил поток вывода, процесс запускает cmd с вызовом nbtstat. С измененным потоком вывода не работает?
Перебор не пробовали? Собрать имена компов в сетке, и их IP просмотреть на совпадение с искомым?
В одноранговой сети при включении компьютер отсылает широковещательный запрос по UDP (137-139,445 порты), оповещая всех, что он включился. Те ему отвечают у кого какой IP.
Слушайте широковещательный пакет и будет вам счастье, также можете попросить другие компы откликнуться послав широковещательный запрос.
Вы имеете ввиду при включении питания? У меня ip может поменяться на "лету". Потом вернуться обратно к старому адресу. А вот по поводу откликнуться, можно немного поподробнее? Просто широковещательных типов запросов много, можно немного уточнить, что вы имели в виду?
uyrij: не, не хочу. Тогда в случае чего придётся бороться с форматированием. Я сталкивался с тем, что на разных версиях компов может быть разное форматирование в утилитах. Поэтому в этой задаче я стараюсь их не использовать. Так бы можно было бы не париться и сразу анализировать ответ netstat, который меня вполне устраивает.
Захаров Александр: Понял, тоже сталкивался с тем что в шеле на разных компах разная кирилическая кодировка и chcp 866 не каждый терминал переделывает. под VBS правда всегда на 1251 можно поменять, но опять же не везде vbs разрешен
Написано
Saboteur
@saboteur_kiev Куратор тега Компьютерные сети
Захаров Александр: можете по-быстрому глянуть исходники команды host, линукс же оперсорс )