Как программно получить внешний IP адрес средствами Delphi?

Доброго времени суток, уважаемые читатели нашего сайта! Сегодня я приведу пример на Delphi, который поможет получить ваш внешний IP адрес в сети Интернет. В статье из этой же серии уже было написано как получить IP адрес компьютера в локальной сети с помощью Delphi. А здесь приведён пример на Delphi, с помощью которого можно получить IP адрес компьютера даже, если он работает в локальной сети и стоит за прокси сервером, шлюзом или маршрутизатором. Этот функционал реализован в небольшой программке GetExternalIP.

Протокол Internet адреса (Internet Protocol Address) позволяет компьютерам (принтерам, модема) взаимодействовать друг с другом в компьютерной сети.

Весь интернет построен на TCP/IP связи. Часть TCP описывает, как два компьютера могут установить соединение друг с другом для передачи данных. IP часть отвечает за передачу и маршрутизацию сообщений между узлами Internet.

Если Ваш компьютер является частью домашней, либо офисной сети, у Вас, скорее всего, есть какое-то оборудование для связи с Интернет, соединяющее домашнюю (офисную) локальную сеть (LAN) с глобальной сетью (WAN).

Как правило, внутренние (локальные) IP адреса это числа типа: «192.68.1.2». Внешние, (глобальные) IP-адрес модема (например, роутер KEENETIC), устанавливаются, когда модем подключается к интернет-провайдеру. Если Вы хотите узнать внешний IP-адрес модема, используя Delphi код, можно воспользоваться услугами сайта «http://www.softmaker.kz».

Сначала на форму нужно бросить компонент IdFTP из набора компонент Indy Clients. Приведенный ниже код нужен, чтобы получить адрес IP модема, который использует Ваш компьютер для подключения к сети Интернет.

function GetHTML(const AURL: string): string;
 var
   sHead,sHost,sPage: string;
   x,xCnt,xCntTotal: integer;
   sock: TClientSocket;
   ws: TWinSocketStream;
   ss: TStringStream;
   buff: array[0..4095] of char;
 const
   CrLf = #13#10;
 begin
   Result := '';
 
   sHost := AURL;
   x := Pos('//',sHost) ;
   if x > 0 then
     System.Delete(sHost,1,x+1) ;
   x := Pos('/',sHost) ;
   if x > 0 then
   begin
     sPage := Copy(sHost,x,Length(sHost)) ;
     System.Delete(sHost,x,Length(sHost)) ;
   end
   else
   begin
     sPage := '/';
   end;
 
   sock := TClientSocket.Create(nil) ;
   try
     try
       sock.ClientType := ctBlocking;
       sock.Port := 80;
       sock.Host := sHost;
       sock.Open;

       // установим задержку на 20 секунд
       ws := TWinSocketStream.Create(sock.Socket,20000) ;
       ss := TStringStream.Create('') ;
       try
         sHead := 'GET ' + sPage + ' HTTP/1.0 ' + CrLf + 
				'Host: ' + sHost + CrLf + CrLf;
         StrPCopy(buff,sHead) ;
 
         ws.Write(buff,Length(sHead) + 1) ;
         ws.Position := 0;
 
         FillChar(buff,SizeOf(buff),0) ;
         repeat
           xCnt := ws.Read(buff,SizeOf(buff)) ;
           xCntTotal := xCntTotal + xCnt;
           ss.Write(buff[0],xCnt) ;
         until xCnt = 0;
 
         Result := ss.DataString;
       finally
         ws.Free;
         ss.Free;
       end;
     except
   end;
   finally
     sock.Free;
   end;
 end;

Вот как можно использовать эту функцию, чтобы получить внешний IP адрес с сайта www.softmaker.kz.

Бросим на форму кнопку и пропишем в обработчике события следующее:

procedure TForm1.Button1Click(Sender: TObject);
var
   ip: string;
 begin
   with TStringlist.Create do
   try
     Text := GetHTML('http://www.softmaker.kz/get_an_external_ip_address.php') ;
     if Count > 0 then ip := Strings[Count - 1];
   finally
     Free;
   end;
   ShowMessage('Ваш внешний адрес ip: ' + ip);
end;

Содержимое файла get_an_external_ip_address.php такое:

<?php

$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;

?>
8 ответы
  1. Aqel говорит:

    Ошибка в sock: TClientSocket;
    Какой подключить компонент?
    Спасибо.

  2. Витя говорит:

    какие компоненты на форму добавлять? если взялись то пишите все!

  3. Softmaker говорит:

    Aqel: Вам нужно подключить модуль ScktComp в разделе uses.

  4. Softmaker говорит:

    Витя: На форму нужно бросить только один компонент IdFTP из набора компонент Indy Clients.

  5. Кирилл говорит:

    Вместо того чтобы программа выдавала мой ip адрес она выдает "Ваш внешний адрес ip:</html>" в чем может быть проблема? можете мне на почту скинуть исходник рабочей программы пожалуйста?

  6. Softmaker говорит:

    Кирилл, здравствуйте! Не понял ваш вопрос.

  7. SeGun говорит:

    Спасибо!
    Отличные статьи. Реально помогло!
    Но вот вопрос:
    Удастся ли приручить всю эту красоту под RAD Studio 2010 ?
    Там и до Indy добраться как то не просто.

    • softmaker говорит:

      Спасибо, не знаю, как на счет RAD Studio.

Комментарии закрыты.