29 / 26 / 6
Регистрация: 18.09.2014
Сообщений: 161
1
.NET 4.x

Определение IP-адреса локальной исходной машины

26.04.2019, 10:08. Показов 6462. Ответов 11

Author24 — интернет-сервис помощи студентам
Здравствуйте!

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

Т.е., у меня есть компьютер, который принимает ip-адрес от DHCP сервера, так.
Я на этом компьютере запускаю свою прогу и мне нужно определить локальный ip-адрес это машины, так.
Как это сделать?

p.s.:
Да, ip-адрес у меня не составляет труда получить, но только в качестве списка всех интерфейсов подключения. В этом то списке и сидит мой локальный адрес, но дело в том, что порядок списка на других компах может быть совершенно другой и класс:
C#
1
IPAddress ip_host = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
с элементом списка 0 уже не работает - я просто получу ip-адрес другого интерфейса.

Как бы ещё сказать... Например, в *.AddressList ip компа "А1" сидит под индексом 3, а если попытаться запустить мою прогу на компе "А2" и попытаться определить локальный ip-адрес "А2", то в *.AddressList он будет под индексом 4.
То есть порядок постоянно меняется и это зависит от того, на каком компе я запускаю свою прогу.
Надеюсь, понятно объяснил.


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

p.s.: p.s.:
Я думал сделать через WMI запросы, но там тоже "выплевывается" целый список адресов.
Думал сделать через реестр, тоже самое - список интерфейсов.
Ещё вариант остался, попробовать сначала определять тип сетевого устройства (Realtek, например) и именно его ip-адрес и вытаскивать. Но я плохо понимаю, как это сделать и думаю, что не поможет...


Добавлено через 10 минут
Может есть какой-то системный каталог, в котором хранятся настройки сетевые и мне просто нужно его найти и прочитать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2019, 10:08
Ответы с готовыми решениями:

Кроссовое определение кол-ва ядер CPU, объёма памяти и собственный IP адрес машины в локальной сети
Собственно есть на Qt что-нибуть для этого?

IP адреса хоста и виртуальной машины
Не могу понять почему у меня IP хоста такой же как и у виртуалки??? IP хоста 10.52...... а...

GIT clone с локальной машины
Всем доброго времени суток! Начал изучать GIT, и в данный момент разбираюсь с работой с...

Программное получение Mac-адреса машины
Как можно получить MAC-адрес машины, например, при открытии базы. Может ли помочь свойство...

11
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,741
26.04.2019, 10:09 2
так выводит?
C#
1
2
3
4
5
6
7
8
var host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (var ip in host.AddressList)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    Console.Writeline(ip.ToString());
                }
            }
0
29 / 26 / 6
Регистрация: 18.09.2014
Сообщений: 161
26.04.2019, 10:24  [ТС] 3
Immo, я дико извиняюсь, что и про этот метод не написал тоже...
И его я пробовал. В этом случае он мне выдает 2 ip-адреса. Один идет у меня от virtualbox, а 2 идёт уже мой конкретно. Тоже не совсем подходит...

Добавлено через 8 минут
Хотя да, метод конечно хороший и в большинстве случаев сработает как надо. Но, если будут на компе стоять несколько адаптеров, то все - вернулись к тому, от чего бежали...
0
1213 / 804 / 244
Регистрация: 08.08.2014
Сообщений: 2,361
26.04.2019, 10:40 4
АлексПрайм
Так у вас же вполне может быть ситуация, когда на машине физически две одинаковые сетевые карты, подключенные к разным сетям/провайдерам. Так что в общем случае, имхо, не получится.

Вероятно, можно попробовать добыть информацию о том интерфейсе, для которого установлен признак "Default Gateway" и считать, что он является основным. Только я так сходу не знаю, как эту информацию получить.
0
29 / 26 / 6
Регистрация: 18.09.2014
Сообщений: 161
26.04.2019, 10:48  [ТС] 5
kotelok, понял, учту
А этот признак так-же используется и в других адаптерах, так что походу да - ниче не выйдет из этого. Хм...
Цитата Сообщение от kotelok Посмотреть сообщение
признак "Default Gateway"
Может быть еще варианты?
0
1213 / 804 / 244
Регистрация: 08.08.2014
Сообщений: 2,361
26.04.2019, 10:54 6
Цитата Сообщение от АлексПрайм Посмотреть сообщение
А этот признак так-же используется и в других адаптерах
Но система ведь как-то определяет, что для 'tracert google.com' нужно использовать именно вот этот интерфейс, который подключен к инету, а не вон тот, который смотрит только в локалку (пусть и тоже со своей сетевухой) и не вот этот виртуальный. Т.е. если явно вручную не задан маршрут до конкретной подсети, то система юзает некий гейт по умолчанию (среди всех имеющихся). Вероятно, можно как-то его добыть и считать, что интерфейс с этим гейтом и есть основной IP машины.

Добавлено через 3 минуты
* я когда дома создаю VPN-адаптер для подключения в рабочую локалку, то винда автоматом делает его гейтом по-умолчанию и при его активации у меня напрочь отваливается инет, пока вручную обратно не укажу, что гейт по умлочанию - провайдерский, а для маршрутов в рабочую сеть (конкретная подсеть) стоит использовать VPN-интерфейс и его гейт.
0
29 / 26 / 6
Регистрация: 18.09.2014
Сообщений: 161
26.04.2019, 11:01  [ТС] 7
Цитата Сообщение от kotelok Посмотреть сообщение
можно попробовать добыть информацию о том интерфейсе
Кстати да. Логический если прийти к этому, то мы когда указываем вручную ip-адреса или через DHCP, то мы обращаемся к настройкам сетевой карты своей (скрин ниже).
То есть, первым делом нужно понять тип сетевого устройства (адаптер виртуальный, или сетевая карта (Realtek и др.) и т.д.).
Вторым делом нужно сверить все параметры: имеется ли шлюз сети, имеется ли доступ к сети, имеется ли маска подсети и др.
И только потом уже делать анализ полученных данных и брать этот сетевой адаптер как за основного...

Сложно, короче...

Добавлено через 2 минуты
Цитата Сообщение от kotelok Посмотреть сообщение
система юзает некий гейт по умолчанию
Кстати да, даже была такая мыслишка!
Цитата Сообщение от kotelok Посмотреть сообщение
система ведь как-то определяет
Да и не только, есть проги даже, которые сами все определяют и понимают. А вот я, я хрен знает как они работают...
Миниатюры
Определение IP-адреса локальной исходной машины  
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
26.04.2019, 11:02 8
Цитата Сообщение от АлексПрайм Посмотреть сообщение
мне нужно определить локальный ip-адрес это машины, так.
Как это сделать?
1) У машины нет такого понятия как локальный адрес машины. У машины может быть несколько сетевых карт (как реальных, так и виртуальных), и для каждой карты будет свой отдельный сетевой адрес. Одна и та же машина может быть одновременно в нескольких подсетях.
Одного единого адреса нет. Изначально нужно понимать, что локальных адресов много.

2) Далее, как же система определяет какую карту и какой адрес использовать для конкретного случая? Какой сетевой адаптер нужно выбрать для конкретного IP адреса?
Это определяется в два этапа. Допустим, я хочу обратится к хосту с адресом 192.168.0.5.
Сначала определяется маска подсети. Для 192.168.0.5 эта маска 255.255.255.0. Затем умножаем маску на наш адрес и получаем сетевой адрес подсети: 192.168.0.0.
Затем среди доступных сетевых интерфейсов ищем тот интерфейс, который имеет туже подсеть, что и исходный адрес.
Обычно такой интерфейс - один. И в таком случае задача решена - сетевой интерфейс найден.

3) Но сетевых интерфейсов для подсети может быть и несколько. В таком случае, помимо подсети нужно учитывать еще и таблицу маршрутизации.
Вы ее можете видеть по команде route print в cmd.

Для расчетов можете посмотреть вот этот код:
https://blogs.msdn.microsoft.c... -networks/
1
29 / 26 / 6
Регистрация: 18.09.2014
Сообщений: 161
26.04.2019, 11:34  [ТС] 9
Цитата Сообщение от Storm23 Посмотреть сообщение
У машины нет такого понятия как локальный адрес машины
В данном случае я лишь хотел сказать, что я ищу адрес именно в локальной сети, а не интернет.

Добавлено через 1 минуту
Цитата Сообщение от Storm23 Посмотреть сообщение
Затем среди доступных сетевых интерфейсов ищем тот интерфейс, который имеет туже подсеть, что и исходный адрес.
А вот это действительно интересно. Даже и в голову не пришло так сделать. Попробую.

Добавлено через 25 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
Для расчетов можете посмотреть вот этот код:
https://blogs.msdn.microsoft.c... -networks/
Спасибо, я сам недавно сделал свои расчеты и разобрался с этим: Работа с маской подсети
0
29 / 26 / 6
Регистрация: 18.09.2014
Сообщений: 161
30.04.2019, 05:06  [ТС] 10
Storm23, тема по прежнему открыта.
Предположим, что пользователь моей программы не знает какой у него диапазон ip-адресов. Открывая мою программу у него сразу отображается диапазон этот. Сам же диапазон ip-адресов высчитывается как тут - Работа с маской подсети.
Однако, при любых обстоятельствах нужно знать хотя бы один ip-адрес локальной сети и шлюз желательно! И без него уже никак не произвести расчеты.

Ваш метод плох тем, что нужно указывать хоть какой-то адрес. А мне нужен такой способ, который работает следующим образом:
1) Открывается программа;
2) Определяется свой ip и диапазон сети;
3) Производится сканирование сети по найденному диапазону.
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
01.05.2019, 02:14 11
Цитата Сообщение от Storm23 Посмотреть сообщение
Допустим, я хочу обратится к хосту с адресом 192.168.0.5.
Сначала определяется маска подсети. Для 192.168.0.5 эта маска 255.255.255.0
вот тут ты перестарался, то что это эти сети,очень похоже что, класса Ц, еще не о чем не говорит...Маска там может быть и 1.0.0.0, конечно, если изолирована.А уж при самом факте условности такого деления, и при нынешней размытости(деление то, было придумано, когда еще маршрутизацию не придумали; потому IPv6 нонче подвис, еще не доросли...)
0
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
01.05.2019, 09:46 12
Цитата Сообщение от Diamante Посмотреть сообщение
очень похоже что, класса Ц, еще не о чем не говорит...
deleted
Однако, не знал, что деление на классы устарело:
Classful addressing is obsolete and has not been used in the Internet since the implementation of Classless Inter-Domain Routing (CIDR), starting in 1993.
0
01.05.2019, 09:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2019, 09:46
Помогаю со студенческими работами здесь

Проблемы перехода с локальной машины на сайт
Добрый день. Когда я в адресной строке вбиваю localhost/папка(с сайтом) мне в место моего сайта...

Подключение к MS SQL с локальной машины по внешнему IP
Доброго времени суток. Натолкните меня в правильное русло. Стоит MS SQL Server 2008. Через...

2 ip-адреса на две машины подключенные к одному роутеру
Здравствуйте! В общем, имеется роутер от "Ростелеком" F@ST1704N. К нему подключены 2 пк и выходим...

Надо узнать IP адрес локальной машины в W9x и NT
Опять у меня вопрос. Я понимаю, что надо и самому книжку иногда открывать. Но у меня такой нет, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru