Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать внешний ip адрес? [D7, WinXP]


RoLeX ©   (2006-10-24 16:43:00) 

Мой комп находится в локальной сети и подключен к интернету. Т.е. он имеет 2 ip адреса: 1 в локалке другой - инетовский (внешний). Как определить внешний ip адрес?

Этот код выводит в Memo1 оба ip адреса, как узнать какой из них внешний:

procedure TForm1.Button1Click(Sender: TObject);
var
 WSAData: TWSAData;
 P: PHostEnt;
 Name: array [0..$FF] of Char;
begin
 WSAStartup($0101, WSAData);
 try
   GetHostName(name, $FF);
   P := GetHostByName(Name);
   while Assigned(P.h_addr_list^) do
   begin
     Memo1.Lines.Add(inet_ntoa(PInAddr(P.h_addr_list^)^));
     Inc(P.h_addr_list);
   end;
 finally
   WSACleanup;
 end;
end;


RoLeX   (2006-10-24 20:31:00) [1]

Во, получилось!

function GetIP: string;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  lpBuffer: array[0..1024 + 1] of Char;
  dwBytesRead: DWORD;
  tlist:TStrings;
  i,j:integer;
begin
tlist:=TStringList.Create; tlist.Clear;
 hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if Assigned(hSession) then
    begin
      hService := InternetOpenUrl(hSession, PChar(' http://checkip.dyndns.org'), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(hService) then
        try
          while True do
          begin
            dwBytesRead := 1024;
            InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);
            if dwBytesRead = 0 then break;
            lpBuffer[dwBytesRead] := #0;
            tlist.Add(lpBuffer);
          end;
        finally
          InternetCloseHandle(hService);
        end;
    end;
  finally
    InternetCloseHandle(hSession);
  end;
for i:=1 to length(tlist[0]) do if copy(tlist[0],i,20)='Current IP Address: ' then
 for j:=i+20 to length(tlist[0]) do if tlist[0][j]<>'<' then result:=result+tlist[0][j] else break;
end;


Dmitrij_K   (2006-10-24 19:16:00) [2]

yoip.ru


StriderMan   (2006-10-24 18:14:00) [3]


>  Как узнать внешний ip адрес?

http://whatismyip.com/


RoLeX   (2006-10-24 18:12:00) [4]

А примером можно? плиз...


guav   (2006-10-24 17:55:00) [5]

Забиндить сокет на адрес и пойти этим сокетом в инет, если получилось, значит адрес инетовский ?


Mike Kouzmine   (2006-10-24 17:50:00) [6]

RoLeX   (24.10.06 17:34) [5]

> Mike Kouzmine ©   (24.10.06 17:28) [4]
> RoLeX   (24.10.06 17:22) [3] А что мешает назначить другие
> адреса? Страшный бармалей?

Ну ладно если я себе назначу адрес из этого диапазона. А как я буду у других на компе назначать?

Не понял.


RoLeX   (2006-10-24 17:34:00) [7]


> Mike Kouzmine ©   (24.10.06 17:28) [4]
> RoLeX   (24.10.06 17:22) [3] А что мешает назначить другие
> адреса? Страшный бармалей?

Ну ладно если я себе назначу адрес из этого диапазона. А как я буду у других на компе назначать?


Mike Kouzmine   (2006-10-24 17:28:00) [8]

RoLeX   (24.10.06 17:22) [3] А что мешает назначить другие адреса? Страшный бармалей?


RoLeX   (2006-10-24 17:22:00) [9]


>  Диапазоны известны.

Кроме 192.168,0,1-255 больше ничего не знаю. А какие ещё есть?


Anatoly Podgoretsky   (2006-10-24 17:03:00) [10]

А если оба входят, а это нормальная ситуация, как и обратная, тогда что?


DVM   (2006-10-24 16:55:00) [11]


> Этот код выводит в Memo1 оба ip адреса, как узнать какой
> из них внешний:

Никак в общем случае. Потому как локалку можно построить и на реальных внешних IP адресах.

Ну а в частности, можно проверить не входит ли IP в один из диапазонов адресов, предназначенных для использования в локальных сетях.
Вот и все. Диапазоны известны.


Наверх

Титульная страница Поиск, карта сайта Написать письмо