![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Избитая тема, Хочу узнать свой IP
sdaf © (2008-01-08 23:58:00)Здравствуйте! У меня проблемка какая-то с узнаванием своего IP адреса. В инете нашел несколько способов но не один не работает как мне надо.
1. с использование IdIPWatch
begin
Edit1.Text:= IdIPWatch1.LocalIP;
Edit2.Text:= IdIPWatch1.LocalName;
end;
-----
2.
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;
Дело в том что я в локальной сети, эти два способа определяют мой локальный ip 10.81.69.19, а мой статический с www.2ip.ru 85.235.223.34 который мне нужен.
Есть какой нибуть способ узнавать IP который внешний, который показываеться в интернете?
Поросенок Винни-Пух (2008-11-14 12:18:00) [1]Хочу узнать свой IP
Ты не свой ип хочешь узнать. а чужой.
Плохиш (2008-11-14 11:45:00) [2]
> идфсльфт (20.05.08 11:38) [8]
Вообще-то в [1] это оформлено более читаемо.
Eraser (2008-11-14 01:01:00) [3]> [0] sdaf © (08.01.08 23:58)
TIdIPAddrMon вполне справляется с этой задачей.
(2008-11-13 23:01:00) [4]Удалено модератором
идфсльфт (2008-05-21 10:51:00) [5]2 DVM © (20.05.08 14:44) [9]
Это верно. Сто пудов :)
DVM (2008-05-20 14:44:00) [6]
> sdaf © (09.01.08 20:49) [7]
> Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная
> фраза
> > с какого сетевого интерфейса пошло обращение к 2ip.ru,
> адрес
> > того и отобразился
А вот и нет. Запросто может отобразиться и совсем другой адрес. В общем случае нет гарантии, что шлюз не окажется, например, NAT маршрутизатором. Тогда у тебя на сетевом интерфейсе будет адрес один, а для компьютеров в интернет обращение с твоего компьютера будет происходить под другим адресом (а то и адресами).
идфсльфт (2008-05-20 11:38:00) [7]// На компьютере может быть установлено несколько сетевых
// плат, тогда у этого компьютера будет несколько IP-адресов.
// Эта процедура найдет все IP-адреса.
uses
..., WinSock;
procedure TForm1.Button1Click(Sender: TObject);
type
InAddr = Array[0..10] of PInAddr;
TInAddr = ^InAddr;
var
Host: PHostEnt;
pPtr: TInAddr;
Buffer: Array[0..63] of char;
i: Integer;
Socket: TWSAData;
begin
ListBox1.Clear;
WSAStartup( $101, Socket );
GetHostName( Buffer, SizeOf( Buffer ) );
Host := GetHostByName( buffer );
if Host = nil then Exit;
pPtr := TInAddr( Host^.h_addr_list );
i := 0;
while pPtr^[i] <> nil do
begin
ListBox1.Items.Add( inet_ntoa( pPtr^[i]^ ) );
Inc( i );
end;
WSACleanup;
end;
sdaf (2008-01-09 20:49:00) [8]Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная фраза
> с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес
> того и отобразился
Danger (2008-01-09 19:31:00) [9]
> sdaf © (09.01.08 19:14) [5]
> Ну например, тот же 2IP.ru мне не выдает все три ip-адреса,
> а только один.
В зависимости от настроек маршрутизации у вас на компьютере. Проще говоря, с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес того и отобразился. У вас может быть сколько угодно интерфейсов, и удаленный сервер не может и не должен знать о всех.
sdaf (2008-01-09 19:14:00) [10]Ну например, тот же 2IP.ru мне не выдает все три ip-адреса, а только один.
Anatoly Podgoretsky (2008-01-09 18:11:00) [11]> sdaf (09.01.2008 17:14:02) [2]
Логически они все три внешнии, только пользователь знает правду.
Dennis I. Komarov (2008-01-09 17:26:00) [12]> [2] sdaf © (09.01.08 17:14)
Нету ни внешних, ни внутренних адресов. адреса на интерфейсе, в какую сторону у тебя смотрят они знаешь только ты.
sdaf (2008-01-09 17:14:00) [13]Спасибо за пример.
Попробавал Вашим способом, я получил три IP-адреса. Я знаю что:
1. ip - 192.168.1.33 мой локальный
2. ip - 89.218.29.96 внешний
3. ip - 5.184.9.246 из хамачи
а если я незнаю этого, как определить какой из них внешний? можно ли сделать какие нибуть критерии для выбора? чтобы показывать сразу тот IP который нужно - только внешний.
локальный IP-адрес не совпадает c прежним, потому что пробовал у знакомого
Anatoly Podgoretsky (2008-01-09 00:43:00) [14]Везде эта ерунда разбросана, совсем не понимают ни принципов работы сетей, ни как устроен компьютер. На компьютере не один интерфейс, а как минимум два, каждый интерфейс может иметь свыше одного адреса.
Вот это код более точный.
Function LocalIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
Begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
// Phe^.h_addr_list - должен содержать IPдля всех интерфейсов.
I := 0;
while pptr^[I] <> nil do begin
// приводим их по очерёдности к нормальному виду
Result := Result + StrPas(inet_ntoa(pptr^[I]^)) + '#10#13' ;
Inc(I);
end;
WSACleanup;
End;