Настройка подавления эха при подключении через TIdTelnet в Delphi XE с Indy10: переопределение процедуры Negotiate
При работе с протоколом Telnet с использованием компонента TIdTelnet в Delphi XE с Indy10 может возникнуть необходимость отключить эхо-отклик сервера на отправляемые клиентом команды. В этом случае можно переопределить процедуру Negotiate компонента TIdTelnet, чтобы отправить команду IAC DONT ECHO серверу, информируя его о том, что клиент не хочет, чтобы сервер эхо-откликался на отправляемые команды.
Вот как это можно сделать:
Создайте класс, унаследовав его от TIdTelnet:
type
TMyIdTelnet = class(TIdTelnet)
private
procedure Negotiate; override;
public
constructor Create(AOwner: TComponent); override;
end;
constructor TMyIdTelnet.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// Дополнительная инициализация, если необходимо
end;
procedure TMyIdTelnet.Negotiate;
begin
// Отправляем команду IAC DONT ECHO серверу
IOHandler.WriteByte(TNC_IAC);
IOHandler.WriteByte(TNC_DONT);
IOHandler.WriteByte(TNO_ECHO);
// Вызываем родительский метод для дальнейшей настройки
inherited Negotiate;
end;
Используйте созданный класс TMyIdTelnet вместо TIdTelnet в своем проекте.
При таком подходе компонент TIdTelnet будет отправлять команду IAC DONT ECHO серверу в начале процесса настройки, информируя его о том, что клиент не хочет, чтобы сервер эхо-откликался на отправляемые команды. Это должно помочь избежать эхо-отклика сервера на команды, отправляемые клиентом.
Альтернативный ответ:
Если вы не хотите переопределять процедуру Negotiate, вы можете использовать компонент TIdConnectionIntercept для перехвата и изменения команды, отправляемой серверу во время настройки. Для этого:
Добавьте компонент TIdConnectionIntercept на форму и свяжите его с компонентом TIdTelnet через свойство Intercept.
Создайте обработчик события OnSend для компонента TIdConnectionIntercept.
В обработчике события проверьте, содержит ли буфер ответа сервера команду IAC WILL ECHO. Если да, измените средний байт на TNC_DONT для отправки команды IAC DONT ECHO серверу.
Пример кода для обработчика события OnSend:
procedure TForm1.IdConnectionIntercept1Send(AContext: TIdContext; ABuffer: TIdBytes; var ABufLen: Integer);
begin
if Length(ABuffer) = 3 then
begin
// Проверяем, содержит ли буфер команду IAC WILL ECHO
if (ABuffer[0] = TNC_IAC) and (ABuffer[1] = TNC_WILL) and (ABuffer[2] = TNO_ECHO) then
begin
// Изменяем средний байт на TNC_DONT для отправки команды IAC DONT ECHO
ABuffer[1] := TNC_DONT;
end;
end;
end;
Этот подход позволяет изменить команду, отправляемую серверу во время настройки, без переопределения процедуры Negotiate. Однако, обратите внимание, что это изменение происходит после вызова события OnTelnetCommand, поэтому вам может потребоваться изменить настройки, сделанные в этом событии, чтобы они соответствовали измененной команде.
В любом случае, как переопределяя процедуру Negotiate, так и используя компонент TIdConnectionIntercept, убедитесь, что сервер поддерживает настройку эха в соответствии со стандартом RFC857, иначе эти изменения могут не дать желаемого результата.
Контекст: Настройка подавления эха при подключении через TIdTelnet в Delphi XE с Indy10: переопределение процедуры Negotiate.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.