Как программно получить внешний 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; ?>
SoftMaker.kz
SoftMaker.kz
SoftMaker.kz
Ошибка в sock: TClientSocket;
Какой подключить компонент?
Спасибо.
какие компоненты на форму добавлять? если взялись то пишите все!
Aqel: Вам нужно подключить модуль ScktComp в разделе uses.
Витя: На форму нужно бросить только один компонент IdFTP из набора компонент Indy Clients.
Вместо того чтобы программа выдавала мой ip адрес она выдает "Ваш внешний адрес ip:</html>" в чем может быть проблема? можете мне на почту скинуть исходник рабочей программы пожалуйста?
Кирилл, здравствуйте! Не понял ваш вопрос.
Спасибо!
Отличные статьи. Реально помогло!
Но вот вопрос:
Удастся ли приручить всю эту красоту под RAD Studio 2010 ?
Там и до Indy добраться как то не просто.
Спасибо, не знаю, как на счет RAD Studio.