ВСЕ ЗАПИСИ
Статьи,заметки
Определение своего IP адреса с помощью приложения на Delphi
Это обновлённая версия статьи
Был доработан код Дельфи-приложения, - в процессе эксплуатации выяснилось, что компонент IdHTTP не всегда восстанавливал работоспособность в случае ошибки, если пропадало соединение с интернетом, программа иногда переставала подавать запросы на сервер, до полного перезапуска, что совершенно недопустимо.Проблема была решена тем, что теперь компонент IdHTTP создаётся динамически, только на время работы таймера и уничтожается по завершении цикла, - теперь всё работает корректно. Исходник в архиве соответственно, тоже заменён исправленной версией.
Раньше,когда ещё мой сайт располагался на бесплатном хостинге,передо мной встал вопрос,что делать с файлами большого размера? - на хостинге было ограничение - максимальный размер файла - не более 15 Мб. Было решено запустить фтп-сервер у себя на компьютере,а на сайте поставить ссылку,чтобы можно было зайти на фтп по IP. Другой вопрос, - мой инернет-провайдер выдаёт мне динамический ip-адрес,который может самопроизвольно меняться 3-5 раз за сутки.Поэтому,периодически требуется посылать на сайт запросы со своего компьютера,чтобы сервер видел мой текущий ip в данный момент и на основаниии его формировал правильную ссылку.
Для этого был написан несложный скрипт
Код PHP
скрипт-обработчик запроса "script.php"
<?php
$ip = $_SERVER['REMOTE_ADDR']; //читаем ip от удалённого клиента
$recip = fopen("ip.txt","w+");
fwrite($recip,"$ip"); //открываем файл ip.txt,который находится в этой же папке и записываем значение ip-адреса
fclose($recip);
echo($ip);
?>
Код PHP
Страница со ссылкой на фтп "index.php"
<?php
$s=file_get_contents('http://site.com/ip.txt'); //открываем файл ip.txt(пишем полный url файла),читаем значение echo '<center><a href="ftp://'.$s.'/ftp">ВХОД НА ФТП-СЕРВЕР</a></center>'; //подставляем значение во внешнюю ссылку,у меня корневая папка фтп так и называется ftp
?>
Приложение-клиент,которое отправляет запросы на сервер,через заданный промежуток времени. Код компиллирован на Delphi 7, версия Indy 9.
На форму добавлены два компонента Button,два Label,два Edit'а и Timer. Timer по умолчанию должен быть отключен (Enabled:=false)
Код Delphi
Скрипт,который будет находиться на сайте,не должен иметь никаких внешних ссылок,чтобы никто посторонний не мог открыть его в своём браузере,иначе ip адрес будет уже не вашим. Чтобы совсем исключить такую ситуацию,можно немного доработать код, - пусть клиент генерирует свой уникальный user agent.unit Unit1; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,StdCtrls,Buttons,ExtCtrls,IdHTTP; type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure TForm1.FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.Text:='http://адрес_скрипта';
//здесь нужно прописать реальный url скрипта,который возвращает значение IP адреса
Edit2.Text:='5';//время опроса сервера,по умолчанию - каждые 5 минут
Timer1.Interval:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
req:Integer;
val:string;
begin
val:=Edit2.Text;
//частота обращений к серверу,сюда ещё желательно прикрутить проверку на корректность заданной величины
//чтобы обрабатывались ошибки,если в Edit введены нецыфровые значения
if val=''then
begin
ShowMessage('Не задано время опроса сервера!');
exit;
end else begin
req:=StrToInt(val)*60000;
Timer1.Interval:=req;
Timer1.Enabled:=true; Form1.Caption:='Running'; end; end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=false;
Form1.Caption:='Stopped';
Label1.Caption:=('IP address');
end;
procedure TForm1.Timer1Timer(Sender:TObject);
var
http:TIdHTTP; begin try
http:=TIdHTTP.Create(nil);
http.Head(PChar(Edit1.Text));
Label1.Caption:=('IP updated at '+TimeToStr(now));//отображаем значение IP и время на Label Label2.Caption:=http.Get(PChar(Edit1.Text)); except begin Label1.Caption:=('Connection failed!'); Label2.Caption:=('Not available!');//уведомляем,если не удалось связаться с сервером http.Free; end; end; end; end.
Для этого в процедуре procedure TForm1.Timer1Timer(Sender: TObject); после http:=TIdHTTP.Create(nil); добавим idHttp1.Request.UserAgent:='ipsend-bla-bla-bla/4.0 (compatible;)'; - выделенное красным заменим на что-нибудь своё,по этой строке скрипт на сервере и будет определять,что эти запросы нужно обрабатывать,а запросы других юзер-агентов будет игнорировать. Для этого доработаем script.php,начинаться он будет так:
<?php
$ua=$_SERVER['HTTP_USER_AGENT'];
$ie='ipsend-bla-bla-bla';
if(strstr($ua,$ie)==false)
{exit;}//завершаем работу скрипта,если в user-agent нет этой строки
Скачать исходники Delpi приложения+серверная часть для определения внешнего IP адреса можно здесь
Также можно скачать уже готовую программу,которая определяет внешний IP адрес,в ней предусмотрена возможность сворачиваться в трей,можно включить звуковое оповещение при соединении с сервером, и обновить IP адрес вручную, кликнув по ярлыку с адресом скрипта
Добавлено: сентябрь 2013
©Veterock
комментарии (2)
Продаем матрасы собственного производства Матрас РВ цв 460-1300 руб Матрас детский РВ 400 руб Подушка РВ 160 руб Подушка синтепон 155 руб Внимание Новинка! Предлагаем спальные комплекты для рабочих: матрас 70х190 п/э + одеяло 1сп. + КПБ п/э 1сп. + подушка 60х60. Цена 1500 руб!!! seojerry@mail.ru
добавлено: 02.07.18 13:13
Продаем матрасы собственного производства Матрас РВ цв 460-1300 руб Матрас детский РВ 400 руб Подушка РВ 160 руб Подушка синтепон 155 руб Внимание Новинка! Предлагаем спальные комплекты для рабочих: матрас 70х190 п/э + одеяло 1сп. + КПБ п/э 1сп. + подушка 60х60. Цена 1500 руб!!! ICQ 726166382
добавлено: 27.06.18 08:46
Обновить
Powered by ©Veterock Studio 2013-2021