Форум: "Сети";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];
ВнизИзбитая тема, Хочу узнать свой IP Найти похожие ветки
← →
sdaf © (2008-01-08 23:58) [0]Здравствуйте! У меня проблемка какая-то с узнаванием своего 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 который внешний, который показываеться в интернете?
← →
Anatoly Podgoretsky © (2008-01-09 00:43) [1]Везде эта ерунда разбросана, совсем не понимают ни принципов работы сетей, ни как устроен компьютер. На компьютере не один интерфейс, а как минимум два, каждый интерфейс может иметь свыше одного адреса.
Вот это код более точный.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;
← →
sdaf © (2008-01-09 17:14) [2]Спасибо за пример.
Попробавал Вашим способом, я получил три IP-адреса. Я знаю что:
1. ip - 192.168.1.33 мой локальный
2. ip - 89.218.29.96 внешний
3. ip - 5.184.9.246 из хамачи
а если я незнаю этого, как определить какой из них внешний? можно ли сделать какие нибуть критерии для выбора? чтобы показывать сразу тот IP который нужно - только внешний.
локальный IP-адрес не совпадает c прежним, потому что пробовал у знакомого
← →
Dennis I. Komarov © (2008-01-09 17:26) [3]> [2] sdaf © (09.01.08 17:14)
Нету ни внешних, ни внутренних адресов. адреса на интерфейсе, в какую сторону у тебя смотрят они знаешь только ты.
← →
Anatoly Podgoretsky © (2008-01-09 18:11) [4]> sdaf (09.01.2008 17:14:02) [2]
Логически они все три внешнии, только пользователь знает правду.
← →
sdaf © (2008-01-09 19:14) [5]Ну например, тот же 2IP.ru мне не выдает все три ip-адреса, а только один.
← →
Danger © (2008-01-09 19:31) [6]
> sdaf © (09.01.08 19:14) [5]
> Ну например, тот же 2IP.ru мне не выдает все три ip-адреса,
> а только один.
В зависимости от настроек маршрутизации у вас на компьютере. Проще говоря, с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес того и отобразился. У вас может быть сколько угодно интерфейсов, и удаленный сервер не может и не должен знать о всех.
← →
sdaf © (2008-01-09 20:49) [7]Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная фраза
> с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес
> того и отобразился
← →
идфсльфт (2008-05-20 11:38) [8]// На компьютере может быть установлено несколько сетевых
// плат, тогда у этого компьютера будет несколько 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;
← →
DVM © (2008-05-20 14:44) [9]
> sdaf © (09.01.08 20:49) [7]
> Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная
> фраза
> > с какого сетевого интерфейса пошло обращение к 2ip.ru,
> адрес
> > того и отобразился
А вот и нет. Запросто может отобразиться и совсем другой адрес. В общем случае нет гарантии, что шлюз не окажется, например, NAT маршрутизатором. Тогда у тебя на сетевом интерфейсе будет адрес один, а для компьютеров в интернет обращение с твоего компьютера будет происходить под другим адресом (а то и адресами).
← →
идфсльфт (2008-05-21 10:51) [10]2 DVM © (20.05.08 14:44) [9]
Это верно. Сто пудов :)
← →
имя (2008-11-13 23:01) [11]Удалено модератором
← →
Eraser © (2008-11-14 01:01) [12]> [0] sdaf © (08.01.08 23:58)
TIdIPAddrMon вполне справляется с этой задачей.
← →
Плохиш © (2008-11-14 11:45) [13]
> идфсльфт (20.05.08 11:38) [8]
Вообще-то в [1] это оформлено более читаемо.
← →
Поросенок Винни-Пух © (2008-11-14 12:18) [14]Хочу узнать свой IP
Ты не свой ип хочешь узнать. а чужой.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c