📄 idtelnet.pas
字号:
ThreadedEvent := False;
end;
destructor TIdTelnet.Destroy;
begin
Disconnect;
inherited Destroy;
end;
procedure TIdTelnet.Disconnect;
begin
if Assigned(FTelnetThread) then begin
FTelnetThread.Terminate;
end;
IAmTelnet := False;
inherited Disconnect;
if Assigned(FOnDisconnect) then begin
OnDisconnect(SELF);
end;
if Assigned(FTelnetThread) then begin
FTelnetThread.WaitFor;
end;
FreeAndNIL(FTelnetThread);
End;//Disconnect
procedure TIdTelnet.DoOnDataAvailable(const Buf: String);
begin
if Assigned(FOnDataAvailable) then begin
OnDataAvailable(SELF, Buf);
end else begin
raise EIdTelnetServerOnDataAvailableIsNil.Create(RSTELNETSRVOnDataAvailableIsNil);
end;
end;
procedure TIdTelnet.Connect(const ATimeout: Integer = IdTimeoutDefault);
begin
inherited Connect(ATimeout);
try
if Assigned(FOnConnect) then begin
OnConnect(SELF);
end;
// create the reading thread and assign the current Telnet object to it
FTelnetThread := TIdTelnetReadThread.Create(SELF);
except
Disconnect;
raise EIdTelnetClientConnectError.Create(RSTELNETCLIConnectError); // translate
end;
end;
procedure TIdTelnet.SendNegotiationResp(var Resp: String);
begin
Write(Resp);
Resp := ''; {Do not Localize}
end;
procedure TIdTelnet.Handle_SB(CurrentSB: Byte; sbData: String; sbCount: Integer);
var
Resp : String;
begin
if (sbcount > 0) and (sbdata = TNOS_TERMTYPE_SEND) then
begin
// if someone inadvertantly sets Termnal to null
// You can set termial to anything you want i supose but be prepared to handle
// the data emulation yourself
if Terminal = '' then {Do not Localize}
Terminal := 'dumb'; {Do not Localize}
Resp := TNC_IAC + TNC_SB + TNO_TERMTYPE + TNOS_TERM_IS + Terminal + TNC_IAC + TNC_SE;
SendNegotiationResp(Resp);
end;
// add authentication code here
end;
procedure TIdTelnet.Negotiate(const Buf: String);
var
LCount: Integer;
bOffset : Integer;
nOffset : Integer;
B : Char;
nBuf : String;
sbBuf : String;
sbCount : Integer;
CurrentSb : Integer;
SendBuf : String;
begin
bOffset := 1;
nOffset := 0;
sbCount := 1;
CurrentSB := 1;
nbuf := ''; {Do not Localize}
LCount := Length(Buf);
while bOffset <= LCount do
begin
b := Buf[bOffset];
case State of
tnsData: { start of command sequence }
if b = TNC_IAC then
begin
IamTelnet := True;
State := tnsIAC;
end
else
nbuf := nbuf + b;
tnsIAC: { a Do request }
case b of
TNC_IAC:
begin
State := tnsData;
inc(nOffset);
nbuf[nOffset] := TNC_IAC;
end;
TNC_WILL:
State := tnsIAC_WILL;
TNC_WONT:
State := tnsIAC_WONT;
TNC_DONT:
State := tnsIAC_DONT;
TNC_DO:
State := tnsIAC_DO;
TNC_EOR:
State := tnsDATA;
TNC_SB:
begin
State := tnsIAC_SB;
sbCount := 0;
end;
else
State := tnsData; // the default setting
end; //end case b
tnsIAC_WILL:
begin
case b of
TNO_ECHO:
begin
Reply := TNC_DO;
DoTelnetCommand(tncNoLocalEcho);
// doStatus('NOLOCALECHO'); {Do not Localize}
end;
TNO_EOR:
Reply := TNC_DO;
else
Reply := TNC_DONT;
end; // end case b
// if (Reply <> SentDoDont) or (TNC_WILL <> ReceivedWillWont) then
begin
SendBuf := TNC_IAC + Reply + b;
SendNegotiationResp(SendBuf);
SentDoDont := Reply;
ReceivedWillWont := TNC_WILL;
end;
State := tnsData;
end; // end of tnsIAC_WILL
tnsIAC_WONT:
begin
case b of
TNO_ECHO:
begin
DoTelnetCommand(tncLocalEcho);
// Dostatus('LOCALECHO'); {Do not Localize}
Reply := TNC_DONT;
end;
TNO_EOR:
Reply := TNC_DONT;
else
Reply := TNC_DONT;
end; // end case b
// if (Reply <> SentDoDont) or (ReceivedWillWont <> TNC_WONT) then
begin
SendBuf := TNC_IAC + Reply + b;
SendNegotiationResp(SendBuf);
SentDoDont := Reply;
ReceivedWillWont := TNC_WILL;
end;
State := tnsData;
end; // end tnsIAC_WONT
tnsIAC_DO:
begin
case b of
TNO_ECHO:
begin
DoTelnetCommand(tncLocalEcho);
Reply := TNC_WILL;
end;
TNO_TERMTYPE:
Reply := TNC_WILL;
//TNO_NAWS:
TNO_AUTH:
begin
// if(Authentication) then
// Reply := TNC_WILL
// else
Reply := TNC_WONT;
end;
else
Reply := TNC_WONT;
end; // end of case b
//if (Reply <> SentWillWont) or (ReceivedDoDont <> TNC_DO) then
begin
SendBuf := TNC_IAC + Reply + b;
SendNegotiationResp(SendBuf);
SentWillWont := Reply;
ReceivedDoDont := TNC_DO;
end;
State := tnsData;
end;
tnsIAC_DONT:
begin
case b of
TNO_ECHO:
begin
DoTelnetCommand(tncEcho);
// DoStatus('ECHO'); {Do not Localize}
Reply := TNC_WONT;
end;
TNO_NAWS:
Reply := TNC_WONT;
TNO_AUTH:
Reply := TNC_WONT
else
Reply := TNC_WONT;
end; // end case b
// if (Reply <> SentWillwont) or (TNC_DONT <> ReceivedDoDont) then
begin
SendBuf := TNC_IAC + reply + b;
SendNegotiationResp(SendBuf);
end;
State := tnsData;
end;
tnsIAC_SB:
begin
if b = TNC_IAC then
State := tnsIAC_SBIAC
else begin
CurrentSb := Ord(b);
sbCount := 0;
State := tnsIAC_SBDATA;
end;
end;
tnsIAC_SBDATA:
begin
if b = TNC_IAC then
State := tnsSBDATA_IAC
else begin
inc(sbCount);
sbBuf := b;
end;
end;
tnsSBDATA_IAC:
case b of
TNC_IAC:
begin
State := tnsIAC_SBDATA;
inc(sbCount);
sbBuf[sbCount] := TNC_IAC;
end;
TNC_SE:
begin
handle_sb(CurrentSB,sbBuf,sbCount);
CurrentSB := 0;
State := tnsData;
end;
TNC_SB:
begin
handle_sb(CurrentSB,sbBuf,sbCount);
CurrentSB := 0;
State := tnsIAC_SB;
end
else
State := tnsDATA;
end;
else
State := tnsData;
end; // end case State
inc(boffset);
end; // end while
// if textual data is returned by the server then send this data to
// the client app
if Length(nBuf) > 0 then begin
DoOnDataAvailable(nBuf);
end;
end;
procedure TIdTelnet.DoTelnetCommand(Status: TIdTelnetCommand);
begin
if Assigned(FOnTelnetCommand) then
FOnTelnetCommand(Self, Status);
end;
END.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -