Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
15-1278348746
SemNic
2010-07-05 20:52
2010.10.03
Могут ли быть проблемы в WIN7 при эксплуатации для проги


15-1278068031
dr_creigan
2010-07-02 14:53
2010.10.03
нужен порт


2-1278083537
AKE
2010-07-02 19:12
2010.10.03
Как скопировать один массив массивов в другой?


15-1278262287
AlexDn
2010-07-04 20:51
2010.10.03
Hello World!


15-1277662562
tesseract
2010-06-27 22:16
2010.10.03
ММП не флудить !!! просто оставляйте, кто сможет приехать в ночь





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский