Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Различие между локальным и инетовским IP [D5, D6, Win95/98, WinME, Win2k, WinXP]


Страницы:   1 2

Rouse_ ©   (2002-09-27 00:04:00) 

Здравствуйте уважаемые мастера, собственно сабж, знаю что тема обсуждалась, но не могу найти пост - вопрос как узнать что (например 192.168.24.1) - адрес из локальный сети а не используется для подключения к интернету

Заранее спасибо


Rouse_   (2002-10-04 23:46:00) [1]

Ух ты столько не был, ща буду разбираться, спасибо всем


Wonder   (2002-10-01 13:20:00) [2]


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;


Forever   (2002-10-01 12:20:00) [3]

Не сочтите за глупый вопрос, но как работать с тем, что вернул GetHostByName ?

Ну например, как заполнить ListBox всеми адресами данной машины ?


Aralekin   (2002-09-30 12:59:00) [4]

Ок! Wander....Ты прав...тут без полкило не разберёшься..Вообще-то тема этой ветки совершенно другая и как-то мы выплыли на этот злосчастный UDP....Лана, открываю новую ветку...


Wonder   (2002-09-30 12:25:00) [5]

2 Wander
2 Arlekin

У тебя есть машина с двумя картами. По одной карте она имеет IP -167.33.33.33 и машину зовут "Wander", а в DNS она имеет IP- 192.168.1.22 и имя "Wander.fuckBank.com".
Тебе вернулось второе имя и IP.

Откуда оно мне вернулось-то?

Так вот теперь будь добр просвети как ты собираешься пинговать машину с компьютера, на котором установленна одна сетевая карта, подключенная к ЛВС???
Если у меня в ЛВС не настроен сервис DNS, то пинговать я буду по IP-адресу и никак иначе.

не очень-то умны и совсем не оригинальны...Если ты без критики не можешь, то хотя бы объясняй что к чему...А то мы тут совсем себя ламерами чувствуем..
Я без критики-то могу. Но и ты, будь добр, следи за, я извиняюсь, своим базаром и "некоторые по типу Wonder-ов" и WAnder-ы вместе с ними не будут тебя критиковать.
По поводу объяснений. Я не могу понять, в чем проблема. Вы тут намесили такое, что без поллитра ну никак не разберешься. Сформулируй задачу нормальным языком безо всяких "педалей" и я думаю, что ты сам найдешь правильный ответ.


Anatoly Podgoretsky   (2002-09-30 10:58:00) [6]

Раз у тебя два и более ИП на машине, то и в ДНС надо иметь соответстующее количестов записей.

Меня немного смущает, что адреса локальной сети у вас используюь Интернетовские адреса и аноборот, может ты просто путаешь.


Aralekin   (2002-09-30 10:04:00) [7]

2 Wander
"Это имя DNS...А в локалке оно нам ни к чему. Получается что и пингом из локалки его тоже не пробьешь."
Это почему же?

......мдааааа.....
У тебя есть машина с двумя картами. По одной карте она имеет IP -167.33.33.33 и машину зовут "Wander", а в DNS она имеет IP- 192.168.1.22 и имя "Wander.fuckBank.com".
Тебе вернулось второе имя и IP. Так вот теперь будь добр просвети как ты собираешься пинговать машину с компьютера, на котором установленна одна сетевая карта, подключенная к ЛВС???

Знаешь, ответы типа
"А сцепление выжать и передачу включить не забыл?"
"Это почему же?
"Очень надежно. Надежнее некуда."
не очень-то умны и совсем не оригинальны...Если ты без критики не можешь, то хотя бы объясняй что к чему...А то мы тут совсем себя ламерами чувствуем..

С уважением к "Мастеру Delphi" ©


Forever   (2002-09-29 16:47:00) [8]

Wonder, не сочти за глупый вопрос, но как работать с тем, что вернул GetHostByName ?

Ну например, как заполнить ListBox всеми адресами данной машины ?


Wonder   (2002-09-29 16:04:00) [9]

"Но при двух карточках такое начинается...Я вчера эксперементировал на разных машинах с разными операционками. Написал небольшую прогу, которая при нажатии на педаль делает следующее:"
А сцепление выжать и передачу включить не забыл?

"В первой строке второй таблицы мы видим, что Имя хоста вернулось совсем не то какое надо:
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 возвращает список всех адресовна данной машине.

"За то, что здесь написанно прошу строго не судить. Все это было полученно из собственного опыта, и шишек набитых на лбу и коленках..."
А мы и не судим... строго ...
Помимо опыта, желательно еще и литературу по предмету читать изредка.


Aralekin   (2002-09-29 10:11:00) [10]

2 Rouse_ :
Уважаемый Rouse_, я тут копалси и копалси, и пришел опытным путем к такому выводу:
Если на машине стоит одна сетевая карточка, то все ОК! Можно и получить адресс отправителя обычным способом, т.е.

I. procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer;
FromIP:String; 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:)


Rouse_   (2002-09-29 00:29:00) [11]

ГЕНИАЛЬНО!!! СПАСИБО ОГРОМНОЕ!!! Вот это идея!!!! (блин вот как сам не додумался, я ж там сам целую кучу инфы посылаю, блин) Спасибо, Malder, ты меня просто выручил очень сильно.


Malder   (2002-09-29 00:21:00) [12]

Rouse_, то есть адрес отправителя броадкаста показывается инетовский ?

Ну тогда предлагаю следующее. В теле броадкаста вместе с прочей информацией посылать адрес отправителя (адрес в локальной сети).


Rouse_   (2002-09-28 23:26:00) [13]

То Malder © (28.09.02 21:55)

Именно из-за того, что в широковещательном пакете содержится левый IP

Заранее спасибо


Malder   (2002-09-28 21:55:00) [14]

Rouse_ © (28.09.02 16:15)

Все таки немного непонятно. Ошибка в том, что не проходит броадкаст или в том, что в теле броадкаста содержится неправильный адрес об отправителе ?


Malder   (2002-09-28 21:49:00) [15]

Честно говоря, я не очень вникал в суть беседы, НО.

Подключение к локальной сети ничем не отключается от подключения к интернету. Только локальная естесственно меньше по размерам, чем глобальная. НУ так и что из этого...


Rouse_   (2002-09-28 16:15:00) [16]

Здравствуйте еще раз, после тщательного анализа кода я нашел первоисточник ошибки. Ув. Aralekin, ваш метод меня навел на правильную мысль. Ошибка возникает именно при посылке броадкаст пакета. Если я указываю точный адрес реципиента, то пакет приходит нормально, а в случае широковещательного, изменяется IP компьютера пославшего пакет (в данном случае того на котором установлен интернет). Дело в том что при посылке пакета у меня в программе обнуляется вся информация о участниках чата, и обновляется по мере прихода от них ответа, а так как ответы участники шлют не на правильный адрес, получается что компьютер с интернетом перестает их видеть, т.е. пинговать с удаленной машины нельзя.. Для отсылки и приема использую TidUDPClient и TidUDPServer

Обычный пакет посылается так: Cli.Send(Host,_Port,Msg);
Широковещательный: Cli.Broadcast(Msg,_Port);

Попытался эмулировать отсылку широковещательного пакета, вышло что-то страшное, не хочется и рассказывать. Может быть это тот случай, когда виновата не программа, а настройки Windows. (Например что-то с переадресацией или в настройках прокси)

Нельзяли высказать соображения по этому поводу.

Заранее спасибо


Aralekin   (2002-09-28 12:54:00) [17]

2 Rouse_
Желаю успехов!


Rouse_   (2002-09-27 23:48:00) [18]

Огромное спасибо, буду разбираться.
К чему я задал вопрос, дело в том что в инет я выхожу через прокси установленый на другой машине в нашей локальной сети. Вся наша сеть использует чат написанный мной (примерно уже как год назад) сейчас и возникла эта проблема, как только появляется инет (он не стабильный - мы выходим по сотовику через тестовый доступ МТС GPRS) - начинаются глюки как с самим чатом так и с сетью, к примеру при сканировании все IP адреса перепутываются, или у меня появляется второй IP адрес. А чат коммерческий, ко мне уже начали сыпаться жалобы по этому поводу именно из-за конфликта нескольких IP.


Aralekin   (2002-09-27 18:41:00) [19]

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 подключены к интернету)...Правда, не пробовал на машине с тремя карточками (Я их даже в глаза не видел):)))))


Wonder   (2002-09-27 17:46:00) [20]

>Aralekin
Ты чего гутаришь?
Ф-ции GetLocalIP() не существует в природе Winsock-a, поэтому ссылаться на нее не надо. Это во-первых.
Ф-ция GetHostByName возвращает списокадресов. Это во-вторых.
В-третьих, что значит фраза "лучше обрашаться к машине по HostName"?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо