-
Сегодня столкнулся вот с каким случаем. В программе есть код, который определяет IP-адрес машины для дальнейших обработок и работы с этим адресом.
function GetLocalIP: String;
const
WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [0..127] of Char;
begin
Result := '';
if WSAStartup(WSVer, wsaData) = 0 then
begin
if GetHostName(@Buf, 128) = 0 then
begin
P := GetHostByName(@Buf);
if P <> nil then
Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end;
WSACleanup;
end;
end;
Все бы ничего, да возьми знакомый и попроси проверить в работе его web-камеру. Говорит, что при подключении к USB комп вешается или выпадает в BSOD. Так вот, включил камеру и пусть думаю весит день в подключенном состоянии. Взялся за отладку программы. Смотрю, а у меня вместо IP адреса моей машины появляется какая то ерунда. Долго не мог понять в чем дело, пока не залез в IpConfig /all. И что я там увидел : http://s018.radikal.ru/i526/1201/28/c9c3a9a00d1f.jpg . Вверху данные по сетевой карте. В подсвеченном участке - данные от web-камеры. Оказывается при подключении камеры в сетевом окруженни появилось еще одно "Подключение по локальной сети" И получается, что моя функция определения IP адреса показывает адрес web-камеры(0.1.0.4, непонятно кем назначенный, возможно прошитый в ней). А ведь к компу можно еще и других устройств наподключать и не известно что они пропишут в сетевом окружении. Вопрос в том, как определить реальный IP адрес именно сетевой карты, подключенной к локальной сети?
-
> как определить реальный IP адрес именно сетевой карты, подключенной > к локальной сети?
Ты не поверишь - других сетей с этой точки зрения и не бывает. Оценивать "реальность" каждого из доступных сетевых интерфейсов, каждому из которых может к тому же быть назнвчено более одного IP-адреса - дело мутное и неблагодарное)
Да и что будешь делать, если обнаружишь дюжину таких "реальных" ?
Правильное решение решение задачи ты скрыл за > для дальнейших обработок и работы с этим адресом
-
> Правильное решение решение задачи ты скрыл за
Ничего секретного. Просто потом вычисляется третий актет и выясняется пренадлежность адреса определенному региону области т.к. для каждого района это константа. Ну а далее другая задача, не важно уже.
-
Ну так вот и ответ на твой вопрос: для каждого IP-адреса (вкупе с маской его подсети) каждого из интерфейсов следует произвести анализ на принадлежность этого адреса диапазону адресов интересующей подсети.
-
Т.е. перебором собрать все найденные IP адреса, повыбирать из них 3-и актеты и сравнивать с шаблоном для дальнейшего анализа пренадлежности? Маска полсети тут я думаю не нужна. А вот что насчет мак-адресов? Смотрю, что реально имеющие значение только интересуемый меня IP-адрес именно сетевой карты. От него можно как то плясать?
-
> перебором собрать все найденные IP адреса, повыбирать из > них 3-и актеты и сравнивать с шаблоном для дальнейшего анализа > пренадлежности? Маска полсети тут я думаю не нужна
Маска подсети и есть шаблон.
> что насчет мак-адресов?
MAC-адрес сетевого устройства запросто может быть фиктивным, от него плясать нельзя. Плясать можно только от принадлежности IP-адреса диапазону адресов интересующей подсети.
-
> Маска подсети и есть шаблон.
В моем случае нет. В моем случае шаблоном является список из 22 номеров(третий актет конкретного региона). Маска подсети для всех одна.
-
> В моем случае нет
Того быть не могёт)
К примеру, у тебя нашлись адреса 1.2.3.4 - адрес в некоей одной подсети 5.6.3.8 - адрес в совсем другой подсети
3-й октет, как видишь, одинаков.
Вопрос на засыпку, какой адрес в интересующем тебя контексте есть "реальный" адрес ?)
-
Сейчас не успею ответить, вечером позже(с домашнего компа) отпишусь, объясню
-
Хуже будет, когда некий виртуальный интерфес поднимет 192.168.1.1/24 и попадет в такую же локальную подсеть :) Вопрос автору, какая маска подсети у этого интерфейса?
-
Система такая. Я не сетевик, особо не знаю как у них там закручено, но смысл такой. У нас в головной организации сервер, внутренняя сетка, маска модсети 255.255.254.0 ну и свои айпи адреса. В нашем подчинении 22 района у каждого своя сеть адресов, отличающаяся только тритьим актетом, маска подсети 255.255.255.0. Третий актет для всех регионов константа и повториться не может. Это как фирменная лейба региона. Посему для того, чтобы определить от какого района пришла информация, мне достаточнр считать айпи адрес на клиентской части, вычислить третий актет, из "справочника" найти что за регион передал инфу и дальше обработка на сервере. Вот как то так.
-
> считать айпи адрес на клиентской части, вычислить третий > актет, из "справочника" найти что за регион передал инфу > и дальше обработка на сервере
Чем дальше в лес - тем толще партизаны) ..
Какое отношение ф-ция GetLocalIP имеет к "что за регион передал инфу" ?
p.s.
> актет
Ты специально что ли коверкаешь слово "октет" ? Глаз режет ..
-
> Какое отношение ф-ция GetLocalIP имеет к "что за регион > передал инфу" ?
Ну же объяснил. По новой что ли писать?[2] 3 октет - число , определяющее район.
-
К принятой-то "инфе" получение локального адреса какое отношение имеет ?
Адрес отправителя "инфы" (адрес удаленного хоста) и адрес получателя "инфы" (адрес локального хоста, тот которым ты интересуешься в GetLocalIP) - это две разные разницы !
Накой шиш получателю интересоваться своим локальным адресом, если, по твоим же словам, его волнует адрес именно отправителя ?)
-
> 3 октет - число , определяющее район.
- 3 октет - определяет 16777216 - IPv4 адресов. У вас в районе 16 миллионов компьютеров?
- согласно маске подсети - район в вашем регионе определяется не октетом, а старшими 23 битами - для головной организации и 24 битами - для районов...
-
> Я не сетевик
"Беда, коль пироги начнет печи сапожник, А сапоги тачать пирожник" (с) «Щука и Кот»
-
> Накой шиш получателю интересоваться своим локальным адресом, > если, по твоим же словам, его волнует адрес именно отправителя > ?)
Я наверное не доходчиво объясняю. Попробую еще раз. В подчинении головного отделения имеется 22 районных предприятия. Сеть одна, связь по ADSL. Каждый район вклчает в себя ряд подразделений(деревни, поселки и т.д), информация из которых передается в районный центр, а уж потом район передает сводную информацию в головной офис.У районных узлов следующие айпи адреса:
1) Гадюкинский р-н 172.25.17.5 2) Муходрищинский р-н 172.25.38.10 3) Чкаловский р-н 172.25.30.3 и т.д
В головном офисе стоит программа-сортировщик которая получает с районов инфформацию. Сканируя принятый файл и находя в определенном месте документа цифру 17 программа определяет, что данные пришли от Гадюкинского района, далее обрабатывая следующий файл, обнаружив цифру 38, определяет, что данные получены от Муходрищинского района и т.д. У головной программы есть справочник со списком определенных чисел, представляющих из себя значения 3-х октетов IP-адресов локальных машин конкретного района. Ну теперь то понятно.
ps Вчера каким то образом получилось удалить сетевое соединение(полученное после подключения камеры, упорно не давало удалить). Сегодня подключил камеру, сетевого соединения не появилось, но камера работает и виден IP-адрес только сетевой карты. Чудеса...
-
> Ну теперь то понятно
Да по-прежнему нихрена не понятно)
Непонятно какова смысловая связь между получением списка локальных (!!!!!) адресов хоста (GetHostByName) и адресами удаленных (!!!!!) хостов, присылающих файлы...
-
> Я наверное не доходчиво объясняю. Попробую еще раз.
не получилось...
> В подчинении головного отделения имеется 22 районных предприятия. > Сеть одна, связь по ADSL.
Суть понимания кроется тут. Что такое "одна сеть"?
> Сканируя принятый файл и находя в определенном месте документа > цифру 17 программа определяет,
Куда-то в лес..
-
Вы может от большого ума все усложняете? (без обид...) но как еще объяснить я уже не знаю. Дайте наводящие вопросы - я отвечу.
|