Форум: "Сети";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизРазличие между локальным и инетовским IP Найти похожие ветки
← →
Rouse_ (2002-09-27 00:04) [0]Здравствуйте уважаемые мастера, собственно сабж, знаю что тема обсуждалась, но не могу найти пост - вопрос как узнать что (например 192.168.24.1) - адрес из локальный сети а не используется для подключения к интернету
Заранее спасибо
← →
Ghost. (2002-09-27 08:40) [1]Смотря откуда ты его берешь...
← →
Rouse_ (2002-09-27 15:45) [2]Получаю следующим образом
function TForm1.GetLockalIP: String;
var WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
result := inet_ntoa(PInAddr(p.h_addr_list^)^);
WSACleanup;
end;
Заранее спасибо
← →
Wonder (2002-09-27 15:54) [3]Ну начнем с того, что и через локальную сеть можно выходить в инет :)
Так что вопрос, по существу, некорректен.
Можно узнать какой IP-адрес какому интерфейсу соответствует.
← →
Aralekin (2002-09-27 17:31) [4]Привет!...Я тоже столкнулся с этой проблеммой.
Тут в чем фишка...Функция GetLockalIP Действительно выдает правильный ИП, но тот который установлен в дефолтовой сетевой карте(то есть та, что имеет индекс 0).
А вот в компе с двумя карточками , причем первая - интернетовская, а вторая - локальная, под 95, 98 и Ме при определении функцией GetLockalIP последняя вернет адресс 192.168.24.1(т.е. интернетовский), равно как и комманда nbtstat -a [HostName].
Но если nbtstat запустить на такой же машине с двумя картами, но с системой W2000 или W-XP, то программа покажет две таблицы для двух карточек.
Делай вывод: Твоя (В чём я лично сомневаюсь) функция не то чтобы не правильная, нет. Она все правильно делает, и IP показывает и если добавишь вот такой код:
Current_Host:=P.h_name;
то и имя машины покажет. Но она берет информацию из той карты , которая имеет Default конфигурацию. А под 9x это - интернетовская карта-ВСЕГДА (глюк или баг как хочешь так и называй).
Поэтому лучше обрашаться к машине по HostName...но это зависит от поставленной задачи...
← →
Wonder (2002-09-27 17:46) [5]>Aralekin
Ты чего гутаришь?
Ф-ции GetLocalIP() не существует в природе Winsock-a, поэтому ссылаться на нее не надо. Это во-первых.
Ф-ция GetHostByName возвращает список адресов. Это во-вторых.
В-третьих, что значит фраза "лучше обрашаться к машине по HostName"?
← →
Aralekin (2002-09-27 18:41) [6]2
<WONDER>
я не гутарю, а всего лишь использую название функции, которую дал Rouse:
>Rouse_ © (27.09.02 15:45)
>Получаю следующим образом
>function TForm1.GetLockalIP: String;
Я тут разбирал тело функции автора и никто не говорил, что GetLockalIP - это Winsock`овая ф-я...Откуда вы сделал такой вывод мне неизвестно, наверное вы не внимательно читали все вышеприведенное здесь...
А что касается злопучного ХостНейм, то это для проверки.
Привожу пример:
У меня машина(Win98) с двумя картами
одна интернетовская(IP=192.168.1.17),
вторая локальная (IP=167.33.10.154).
При опросе сети с другой машины (IP=167.33.34.67, без второй карточки интернетовской) Функция GetLokalIP возвращает ей мой интернетовский IP. И конечно получая его IP=167.33.34.67 не сможет обратится ко мне для сокетного соединения так она получила (IP=192.168.1.17).
Поэтому я говорил что к машинам в локалке необходимо обращаться по имени машины. Воизбежание недоразумений я приведу код.А то некоторые по типу Wonder`ов не читают как следует что тут написанно:
Procedure TForm1.GetSockInfo( Var Current_Host:String; Var Current_Ip:String);
var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
Current_Host:=P.h_name;
Current_IP:=inet_ntoa(PInAddr(p.h_addr_list^)^);
WSACleanup;
End;
procedure TForm1.Button1Click(Sender: TObject);
Var
Host,IP:String;
begin
GetCompInfo(Host,IP);
//Далее, Делаешь ping по Host,
//И если IP будет равен тому адрессу что вернет тебе Пинг,
//то значит все Ок! Адресс является из локальной сети,
//Ну а если нет, то значит адресс интернетовский.
end;
Если какие-то замечания, то будьте любезны указать мне их..
Этот код тысячи раз проверен и все работает в нашем парке машин (их 430 и из них 120 подключены к интернету)...Правда, не пробовал на машине с тремя карточками (Я их даже в глаза не видел):)))))
← →
Rouse_ (2002-09-27 23:48) [7]Огромное спасибо, буду разбираться.
К чему я задал вопрос, дело в том что в инет я выхожу через прокси установленый на другой машине в нашей локальной сети. Вся наша сеть использует чат написанный мной (примерно уже как год назад) сейчас и возникла эта проблема, как только появляется инет (он не стабильный - мы выходим по сотовику через тестовый доступ МТС GPRS) - начинаются глюки как с самим чатом так и с сетью, к примеру при сканировании все IP адреса перепутываются, или у меня появляется второй IP адрес. А чат коммерческий, ко мне уже начали сыпаться жалобы по этому поводу именно из-за конфликта нескольких IP.
← →
Aralekin (2002-09-28 12:54) [8]
2 Rouse_
Желаю успехов!
← →
Rouse_ (2002-09-28 16:15) [9]Здравствуйте еще раз, после тщательного анализа кода я нашел первоисточник ошибки. Ув. Aralekin, ваш метод меня навел на правильную мысль. Ошибка возникает именно при посылке броадкаст пакета. Если я указываю точный адрес реципиента, то пакет приходит нормально, а в случае широковещательного, изменяется IP компьютера пославшего пакет (в данном случае того на котором установлен интернет). Дело в том что при посылке пакета у меня в программе обнуляется вся информация о участниках чата, и обновляется по мере прихода от них ответа, а так как ответы участники шлют не на правильный адрес, получается что компьютер с интернетом перестает их видеть, т.е. пинговать с удаленной машины нельзя.. Для отсылки и приема использую TidUDPClient и TidUDPServer
Обычный пакет посылается так: Cli.Send(Host,_Port,Msg);
Широковещательный: Cli.Broadcast(Msg,_Port);
Попытался эмулировать отсылку широковещательного пакета, вышло что-то страшное, не хочется и рассказывать. Может быть это тот случай, когда виновата не программа, а настройки Windows. (Например что-то с переадресацией или в настройках прокси)
Нельзяли высказать соображения по этому поводу.
Заранее спасибо
← →
Malder (2002-09-28 21:49) [10]Честно говоря, я не очень вникал в суть беседы, НО.
Подключение к локальной сети ничем не отключается от подключения к интернету. Только локальная естесственно меньше по размерам, чем глобальная. НУ так и что из этого...
← →
Malder (2002-09-28 21:55) [11]Rouse_ © (28.09.02 16:15)
Все таки немного непонятно. Ошибка в том, что не проходит броадкаст или в том, что в теле броадкаста содержится неправильный адрес об отправителе ?
← →
Rouse_ (2002-09-28 23:26) [12]То Malder © (28.09.02 21:55)
Именно из-за того, что в широковещательном пакете содержится левый IP
Заранее спасибо
← →
Malder (2002-09-29 00:21) [13]Rouse_, то есть адрес отправителя броадкаста показывается инетовский ?
Ну тогда предлагаю следующее. В теле броадкаста вместе с прочей информацией посылать адрес отправителя (адрес в локальной сети).
← →
Rouse_ (2002-09-29 00:29) [14]ГЕНИАЛЬНО!!! СПАСИБО ОГРОМНОЕ!!! Вот это идея!!!! (блин вот как сам не додумался, я ж там сам целую кучу инфы посылаю, блин) Спасибо, Malder, ты меня просто выручил очень сильно.
← →
Aralekin (2002-09-29 10:11) [15]2 Rouse_ :
Уважаемый Rouse_, я тут копалси и копалси, и пришел опытным путем к такому выводу:
Если на машине стоит одна сетевая карточка, то все ОК! Можно и получить адресс отправителя обычным способом, т.е.
FromIP:String;
I. procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer;Port: Integer);
.
Но при двух карточках такое начинается...Я вчера эксперементировал на разных машинах с разными операционками. Написал небольшую прогу, которая при нажатии на педаль делает следующее:
1. Вычисляет свой IP и HostName
2. Формирует и посылает широковещанием пакет, в который включает данные типа:
, в котором
II. Udp.Broadcast("<"+InttoStr(Len)+">@"+IP+"#"+host+"#Serv#",21012);
Len - Длина всего пакета.
IP - IP-адрес вычисленный (функция GetlokalIP)
Host - Host-Имя машины вычисленное (функция GetlokalIP)
3. На прием поставил обработку пакета, выдирание из него IP-адреса и выдирание Host
4. Вот какие получил результаты:
Реальные Данные:
=====================================================
Host IP(лок) IP(Инет) OC
=====================================================
1.Natalya 167.33.36.142 192.168.1.20 Win98
2.Olga 167.33.36.152 192.168.1.17 WinMe
3.Gosha 167.33.34.254 192.168.1.2 WinXP
=====================================================
Полученные данные после обработки:
=================================================
Host IP(II) IP(I)
=================================================
1.Natalya.XXX.com 192.168.1.20 167.33.36.142
2.Olga 167.33.36.152 192.168.1.17
3.Gosha 192.168.1.2 192.168.1.2
=================================================
где (II) Ip, который я вычисляю локально и отправляю в пакете
(I) IP, который показывает TForm1.NMUDP1DataReceived.
После долгих раздумий я и наш админ пришли к выводу, что точно определить адрес можно , если сравнить IP-шники. И узнав какой из них локальный, выполнять дальнейшии действия.
Но посмотрев на вторую таблицу, на третью строчку,
3.Gosha 192.168.1.2 192.168.1.2
я подумал что у меня крыша поехала...С двух карт пришли одинаковые адреса ...ВОТ ТАКОГО Я НЕ ОЖИДАЛ!!!
К счастью есть имя Хоста, который можно пингануть и тогда получить АБСОЛЮТНО Верный IP. Да. Но тут опять попадаются подводные камни.
В первой строке второй таблицы мы видим, что Имя хоста вернулось совсем не то какое надо:
1.Natalya.XXX.com 192.168.1.20 167.33.36.142
Это имя DNS...А в локалке оно нам ни к чему. Получается что и пингом из локалки его тоже не пробьешь. Чуть посидев я нашел выход - брать имя хоста из процедурыProcedure TForm1.GetCompInfo( Var Current_Host:String; Var Current_Ip:String);
нельзя(читай не надежно).
Procedure TForm1.GetCompInfo( Var Current_Host:String; Var Current_Ip:String);
var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
Current_Host:=P.h_name;
WSACleanup;
End;
Имя компютера можно взять и из реестра, где он храниться в разделе:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName\ComputerName
параметр "ComputerName":String
Чуть доработав программу получилось след.:
Клиент получив запрос на отклик, отсылает серверу ответ в котором дает свой IP и имя Хоста из реестра. Сервер же, если видит что IP-шники не совпадают или отличается маска, делает пинг по полученому Хосту и получает точный IP клиента в локальной сети.
Вот какая фигня получается....Навороченно, но работает железно.
А к вот почему Винда такую хренатень делает с сетевыми картами, спрашивайте у Блин Гейтса..ему виднее.
Все проблемы возникают из-зи того что какая-то карта имеет Eth0,
a какая-то 1...вот отсюда и путаница....
За то, что здесь написанно прошу строго не судить. Все это было полученно из собственного опыта, и шишек набитых на лбу и коленках...
(:AraLekin:)
← →
Wonder (2002-09-29 16:04) [16]"Но при двух карточках такое начинается...Я вчера эксперементировал на разных машинах с разными операционками. Написал небольшую прогу, которая при нажатии на педаль делает следующее:"
А сцепление выжать и передачу включить не забыл?
"В первой строке второй таблицы мы видим, что Имя хоста вернулось совсем не то какое надо:
1.Natalya.XXX.com 192.168.1.20 167.33.36.142"
А какое надо? Вернулось-то как раз правильное имя хоста.
"Это имя DNS...А в локалке оно нам ни к чему. Получается что и пингом из локалки его тоже не пробьешь."
Это почему же?
"Чуть посидев я нашел выход - брать имя хоста из процедуры Procedure TForm1.GetCompInfo( Var Current_Host:String; Var Current_Ip:String); нельзя(читай не надежно)."
Очень надежно. Надежнее некуда.
"Имя компютера можно взять и из реестра, где он храниться в разделе:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ComputerName\ComputerName
параметр "ComputerName":String"
Имя компьютера (computername) и имя хоста (hostname) АБАСОЛЮТНО разные весчи.
"Вот какая фигня получается..."
Это точно. Полнейшая фигня, причем.
"А к вот почему Винда такую хренатень делает с сетевыми картами, спрашивайте у Блин Гейтса..ему виднее."
Зачем же прям к Билли-то? Можно и здесь спросить. Нам тоже видно кое-чего.
"Все проблемы возникают из-зи того что какая-то карта имеет Eth0,
a какая-то 1...вот отсюда и путаница...."
А никакой путаницы нет.
Ты тут сказал, что "некоторые по типу Wonder`ов не читают как следует что тут написанно". Так вот, повторяюсь для "не таких как Wonder": ф-ция GetHostByName возвращает список всех адресов на данной машине.
"За то, что здесь написанно прошу строго не судить. Все это было полученно из собственного опыта, и шишек набитых на лбу и коленках..."
А мы и не судим... строго ...
Помимо опыта, желательно еще и литературу по предмету читать изредка.
← →
Forever (2002-09-29 16:47) [17]Wonder, не сочти за глупый вопрос, но как работать с тем, что вернул GetHostByName ?
Ну например, как заполнить ListBox всеми адресами данной машины ?
← →
Aralekin (2002-09-30 10:04) [18]2 Wander
"Это имя DNS...А в локалке оно нам ни к чему. Получается что и пингом из локалки его тоже не пробьешь."
Это почему же?
......мдааааа.....
У тебя есть машина с двумя картами. По одной карте она имеет IP -167.33.33.33 и машину зовут "Wander", а в DNS она имеет IP- 192.168.1.22 и имя "Wander.fuckBank.com".
Тебе вернулось второе имя и IP. Так вот теперь будь добр просвети как ты собираешься пинговать машину с компьютера, на котором установленна одна сетевая карта, подключенная к ЛВС???
Знаешь, ответы типа
"А сцепление выжать и передачу включить не забыл?"
"Это почему же?
"Очень надежно. Надежнее некуда."
не очень-то умны и совсем не оригинальны...Если ты без критики не можешь, то хотя бы объясняй что к чему...А то мы тут совсем себя ламерами чувствуем..
С уважением к "Мастеру Delphi" ©
← →
Anatoly Podgoretsky (2002-09-30 10:58) [19]Раз у тебя два и более ИП на машине, то и в ДНС надо иметь соответстующее количестов записей.
Меня немного смущает, что адреса локальной сети у вас используюь Интернетовские адреса и аноборот, может ты просто путаешь.
← →
Wonder (2002-09-30 12:25) [20]2 Wander
2 Arlekin
У тебя есть машина с двумя картами. По одной карте она имеет IP -167.33.33.33 и машину зовут "Wander", а в DNS она имеет IP- 192.168.1.22 и имя "Wander.fuckBank.com".
Тебе вернулось второе имя и IP.
Откуда оно мне вернулось-то?
Так вот теперь будь добр просвети как ты собираешься пинговать машину с компьютера, на котором установленна одна сетевая карта, подключенная к ЛВС???
Если у меня в ЛВС не настроен сервис DNS, то пинговать я буду по IP-адресу и никак иначе.
не очень-то умны и совсем не оригинальны...Если ты без критики не можешь, то хотя бы объясняй что к чему...А то мы тут совсем себя ламерами чувствуем..
Я без критики-то могу. Но и ты, будь добр, следи за, я извиняюсь, своим базаром и "некоторые по типу Wonder-ов" и WAnder-ы вместе с ними не будут тебя критиковать.
По поводу объяснений. Я не могу понять, в чем проблема. Вы тут намесили такое, что без поллитра ну никак не разберешься. Сформулируй задачу нормальным языком безо всяких "педалей" и я думаю, что ты сам найдешь правильный ответ.
← →
Aralekin (2002-09-30 12:59) [21]Ок! Wander....Ты прав...тут без полкило не разберёшься..Вообще-то тема этой ветки совершенно другая и как-то мы выплыли на этот злосчастный UDP....Лана, открываю новую ветку...
← →
Forever (2002-10-01 12:20) [22]Не сочтите за глупый вопрос, но как работать с тем, что вернул GetHostByName ?
Ну например, как заполнить ListBox всеми адресами данной машины ?
← →
Wonder (2002-10-01 13:20) [23]
var WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
while (p.h_addr_list^ <> nil) do begin
memo1.Lines.Add(inet_ntoa(PInAddr(p.h_addr_list^)^));
inc(p.h_addr_list);
end;
WSACleanup;
end;
← →
Rouse_ (2002-10-04 23:46) [24]Ух ты столько не был, ща буду разбираться, спасибо всем
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c