Конференция "Сети" » Избитая тема, Хочу узнать свой IP
 
  • sdaf © (08.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 © (09.01.08 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 © (09.01.08 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 © (09.01.08 17:26) [3]
    > [2] sdaf ©   (09.01.08 17:14)

    Нету ни внешних, ни внутренних адресов. адреса на интерфейсе, в какую сторону у тебя смотрят они знаешь только ты.
  • Anatoly Podgoretsky © (09.01.08 18:11) [4]
    > sdaf  (09.01.2008 17:14:02)  [2]

    Логически они все три внешнии, только пользователь знает правду.
  • sdaf © (09.01.08 19:14) [5]
    Ну например, тот же 2IP.ru мне не выдает все три ip-адреса, а только один.
  • Danger © (09.01.08 19:31) [6]

    > sdaf ©   (09.01.08 19:14) [5]
    > Ну например, тот же 2IP.ru мне не выдает все три ip-адреса,
    >  а только один.

    В зависимости от настроек маршрутизации у вас на компьютере. Проще говоря, с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес того и отобразился. У вас может быть сколько угодно интерфейсов, и удаленный сервер не может и не должен знать о всех.
  • sdaf © (09.01.08 20:49) [7]
    Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная фраза
    > с какого сетевого интерфейса пошло обращение к 2ip.ru, адрес
    > того и отобразился
  • идфсльфт (20.05.08 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 © (20.05.08 14:44) [9]

    > sdaf ©   (09.01.08 20:49) [7]
    > Ну понятно, Спасибо. Теперь смогу сделать свою прогу. Главная
    > фраза
    > > с какого сетевого интерфейса пошло обращение к 2ip.ru,
    >  адрес
    > > того и отобразился

    А вот и нет. Запросто может отобразиться и совсем другой адрес. В общем случае нет гарантии, что шлюз не окажется, например, NAT маршрутизатором. Тогда у тебя на сетевом интерфейсе будет адрес один, а для компьютеров в интернет обращение с твоего компьютера будет происходить под другим адресом (а то и адресами).
  • идфсльфт (21.05.08 10:51) [10]
    2 DVM ©   (20.05.08 14:44) [9]
    Это верно. Сто пудов :)
  • имя (13.11.08 23:01) [11]
    Удалено модератором
  • Eraser © (14.11.08 01:01) [12]
    > [0] sdaf ©   (08.01.08 23:58)

    TIdIPAddrMon вполне справляется с этой задачей.
  • Плохиш © (14.11.08 11:45) [13]

    > идфсльфт   (20.05.08 11:38) [8]

    Вообще-то в [1] это оформлено более читаемо.
  • Поросенок Винни-Пух © (14.11.08 12:18) [14]
    Хочу узнать свой IP

    Ты не свой ип хочешь узнать. а чужой.
 
Конференция "Сети" » Избитая тема, Хочу узнать свой IP
Есть новые Нет новых   [134434   +28][b:0][p:0.001]