-
Здравствуйте! У меня проблемка какая-то с узнаванием своего 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 который внешний, который показываеться в интернете?
-
Везде эта ерунда разбросана, совсем не понимают ни принципов работы сетей, ни как устроен компьютер. На компьютере не один интерфейс, а как минимум два, каждый интерфейс может иметь свыше одного адреса. Вот это код более точный. 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);
I := 0;
while pptr^[I] <> nil do begin
Result := Result + StrPas(inet_ntoa(pptr^[I]^)) + '#10#13' ;
Inc(I);
end;
WSACleanup;
End;
-
Спасибо за пример. Попробавал Вашим способом, я получил три IP-адреса. Я знаю что: 1. ip - 192.168.1.33 мой локальный 2. ip - 89.218.29.96 внешний 3. ip - 5.184.9.246 из хамачи а если я незнаю этого, как определить какой из них внешний? можно ли сделать какие нибуть критерии для выбора? чтобы показывать сразу тот IP который нужно - только внешний. локальный IP-адрес не совпадает c прежним, потому что пробовал у знакомого
-
> [2] sdaf © (09.01.08 17:14)
Нету ни внешних, ни внутренних адресов. адреса на интерфейсе, в какую сторону у тебя смотрят они знаешь только ты.
-
> sdaf (09.01.2008 17:14:02) [2]
Логически они все три внешнии, только пользователь знает правду.
-
Ну например, тот же 2IP.ru мне не выдает все три ip-адреса, а только один.
-
> sdaf © (09.01.08 19:14) [5] > Ну например, тот же 2IP.ru мне не выдает все три ip-адреса, > а только один.
В зависимости от настроек маршрутизации у вас на компьютере. Проще говоря, с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес того и отобразился. У вас может быть сколько угодно интерфейсов, и удаленный сервер не может и не должен знать о всех.
-
Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная фраза > с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес > того и отобразился
-
// На компьютере может быть установлено несколько сетевых // плат, тогда у этого компьютера будет несколько 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 © (09.01.08 20:49) [7] > Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная > фраза > > с какого сетевого интерфейса пошло обращение к 2ip.ru, > адрес > > того и отобразился
А вот и нет. Запросто может отобразиться и совсем другой адрес. В общем случае нет гарантии, что шлюз не окажется, например, NAT маршрутизатором. Тогда у тебя на сетевом интерфейсе будет адрес один, а для компьютеров в интернет обращение с твоего компьютера будет происходить под другим адресом (а то и адресами).
-
2 DVM © (20.05.08 14:44) [9] Это верно. Сто пудов :)
-
Удалено модератором
-
> [0] sdaf © (08.01.08 23:58)
TIdIPAddrMon вполне справляется с этой задачей.
-
> идфсльфт (20.05.08 11:38) [8]
Вообще-то в [1] это оформлено более читаемо.
-
Хочу узнать свой IP
Ты не свой ип хочешь узнать. а чужой.
|