Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.03;
Скачать: CL | DM;

Вниз

Избитая тема, Хочу узнать свой 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1278658000
Виталий
2010-07-09 10:46
2010.10.03
Установить группу битов числа


15-1278492389
И. Павел
2010-07-07 12:46
2010.10.03
Как лучше работать с сетевым приложением?


2-1278606821
Tima
2010-07-08 20:33
2010.10.03
ado и access


4-1239779606
TAG
2009-04-15 11:13
2010.10.03
BIOS, ZwOpenSection и Vista


15-1278309120
Ulugbek
2010-07-05 09:52
2010.10.03
Как удалить в самом Delphi Recent open files?