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