Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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_, я тут копалси и копалси, и пришел опытным путем к такому выводу:
Если на машине стоит одна сетевая карточка, то все ОК! Можно и получить адресс отправителя обычным способом, т.е.

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:)


 
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.009 c
4-4689
Semion
2002-10-18 07:03
2002.12.02
RasDial


3-4235
Cranium
2002-11-14 13:32
2002.12.02
Из Excel в БД .........


1-4383
Рома
2002-11-22 15:16
2002.12.02
Help!!! Миграция с Delphi 4 Delphi 5


1-4372
chak
2002-11-22 12:29
2002.12.02
Копирование файлов+ProgressBar


1-4448
zam2000
2002-11-20 10:28
2002.12.02
как сделать разрыв страницы в RichEdit при печати





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский