Контрол на приложението чрез Telnet

Delphi, Интернет и мрежи, Протоколи

Управление на приложението чрез Telnet
Надписът на гроба на немодернизирания компютър 276: „Той не можеше да влезе в Интернет“.

И така, нека започнем с основното - защо трябва да използвате Telnet за отдалечено администриране на вашата програма? Отговорът на този въпрос е доста прост:

  • Помощната програма Telnet е достъпна на всеки компютър с Windows, UNIX, AIX и т.н., така че не е необходимо да се пише или инсталира
  • Telnet е стандартен инструмент за отдалечено администриране.
  • Telnet предполага текстов обмен, така че е много лесно да го поддържате във вашата програма.
  • Възможностите на текстовия терминал обикновено са достатъчни за управление на програмата, нейното конфигуриране и администриране.

Помощната програма Telnet поддържа опции на командния ред:

Протоколът Telnet е много прост - първо се установява TCP/IP връзка с отдалечена машина. След това, когато потребителят въведе знак, той се предава на отдалечения хост. За простота ще го наречем сървър.

Освен това са възможни два режима на работа - с локално ехо или без локално ехо (режим по подразбиране). Ако работите с локално ехо, тогава всеки знак, въведен от потребителя, веднага се показва на екрана. Когато работите без локално ехо, сървърът трябва да създаде ехо, дублирайки получените данни на клиента. Това ще ви позволи да тествате канала (всеки знак се движи в кръг) и да организирате въвеждане на данни без ехо (например, за да въведете парола). Моите примери са ориентирани да работят без локално ехо.

При получаване на информация от сървъра помощната програма Telnet незабавно я показва на екрана. Това позволява на сървъра да организира ехо и да изведе всякоинформация в текстова форма. В същото време се поддържат някои контролни кодове, например кодът "backspace", който изтрива един знак.

И така, нека започнем да разработваме приложението. Нека създадем празен проект и поставим компонента ServerSocket1 от типа TServerSocket във формуляра. Нека зададем порт за него, например 5000. Напомням ви, че:

  • номерът на порта трябва да е нестандартен, за да не пречи на други програми. В този случай е желателно да го прочетете от INI файла, което ще позволи да го конфигурирате, ако е необходимо.
  • Свойството Active трябва да е false и да е зададено на true при стартиране на програмата. В противен случай приложението ще се срине при опит за стартиране на второ копие или ако няма мрежа. Настройката Active := true трябва да се направи в блок за опит. с изключение

Така че в манипулатора OnCreate на формуляра пишем:

След това трябва да се научите как да определяте моментите на свързване и изключване на клиента. За да направите това, създайте манипулатори OnClientConnect и OnClientDisconnect. Веднага отбелязвам, че когато клиент се свърже, обикновено е обичайно да му се даде заглавка, показваща, че той се е свързал с програмата *** на версията NN. Имайки това предвид, манипулаторът OnClientConnect ще изглежда така:

В същото време искам да подчертая една особеност - една връзка се поддържа нормално, за няколко са необходими някои усложнения и засега ще ги пропуснем.

  • Желателно е информацията да се извежда при свързване на английски език. Така се избягва ситуацията, когато компютърът на администратора не поддържа български език и Telnet ще му покаже абракадабра. Виждам това през цялото време на английски NT 4 - всеки път, когато трябва да се кача в настройките на Telnet и да задавам българския CharSet.
  • При свързване поискайте парола. В противен случай всеки, който няма какво да прави, ще се качипрограма и ще се рови там (от практика - имаше прецеденти).

Променливата Connected показва, че потребителят все още не се е свързал с програмата (т.е. не се е удостоверил). Помислете веднага за манипулатора OnClientDisconnect, той е още по-прост:

Така че сега е време за забавната част - писане на манипулатора OnClientRead. Този манипулатор се извиква всеки път, когато се получат данни от клиента. Тези. в светлината на горните теоретични забележки, това ще се случи при всеки един въведен знак. Задачи на процесора:

  • Създайте (ако е необходимо) ехо за всички получени знаци. Очевидно, когато въвеждате пароли, не е необходимо да създавате ехо. Когато създавате ехо, трябва да се има предвид, че знакът с FF кода (буквата "i") трябва да се повтори два пъти, в противен случай той ще бъде усвоен от Telnet като услуга и няма да бъде показан
  • Натрупване на въведени знаци, изчакване на знака за край на командата. По правило преводът на кода на реда се счита за знак за край на командата (трябва да се отбележи, че тук разработчикът е свой собствен стандарт, но не се препоръчва да се отклонявате от общоприетите правила. За да натрупате получената информация, струва си да създадете буферна променлива, в моя случай тя ще се нарича TelnetS.
  • Когато се получи знак с код 08h ("BackSpace"), е необходимо той да не се поставя в буфера, а да се изтрие последния символ от буфера. Но е необходимо да го изпратите под формата на ехо, т.к това ще изтрие знака на екрана на Telnet (с анулиране на ехото той ще остане на екрана, но ще бъде изтрит в програмния буфер, което води до объркване).
  • Когато бъде намерен знак за нов ред (код $0D), съдържанието на буфера трябва да се прочете като команда и да се интерпретира. Как е отделен разговор.

Всичко по-горе прилага приблизително следния код:

Както можете лесно да видите, кодът по-горе прилага ехо, обработва BackSpace и изчаква въвеждането на командата, разглеждайки кода $OD (Enter) като знак за завършване на въвеждането на командата. Когато този код бъде открит, се извиква потребителската функция ExecuteCMD, която трябва да анализира и анализира командата, да я изпълни и да върне (ако е необходимо) отговор на потребителя. Същата функция проверява паролата, въведена от потребителя. Тъй като предаването на отговор/ехо има някои особености, например необходимостта от удвояване на знака с FF кода и потискане на предаването за прилагане на невидим вход, има смисъл да се реализира като отделна функция:

Действителната система от команди естествено се определя от разработчика, но се препоръчва да предоставите следните команди:

  • ?, HLP, HELP за показване на помощна информация (практиката показва, че при поддръжка на 20-30 команди повече от половината се забравят за един месец)
  • ИЗХОД - край на борсата

И накрая, в заключение, трябва да се отбележи една функция - потребителят може да прекрати обмена правилно (като въведе командата EXIT (ако се поддържа) или като избере опцията "Деактивиране" в Telnet; и неправилно - като затвори Telnet по време на обмена. В този случай програмата ще има грешка на сокета 10054. Има смисъл да я хванете и потискате с помощта на манипулатора OnClientError от следната форма:

И в заключение бих искал да кажа, че подобна система е внедрена в няколко от моите програми, използвани в OJSC Smolenskenergo и се е доказала отлично, т.к. предприятието е голямо и възможността за отдалечено конфигуриране/управление в някои случаи освобождава разработчика от ненужно тичане.

СтатияКонтрол на приложения чрез Telnet в раздела Интернет и мрежови протоколи може да бъде полезна заразработчици в Delphi и FreePascal.

Коментари и въпроси