![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Различие между локальным и инетовским IP [D5, D6, Win95/98, WinME, Win2k, WinXP]
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_, я тут копалси и копалси, и пришел опытным путем к такому выводу:
Если на машине стоит одна сетевая карточка, то все ОК! Можно и получить адресс отправителя обычным способом, т.е.
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:)
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"?