Indy server application: Hvordan kan jeg se hvilket client der har sendt en given \"command\"?
Nedenstående code er en ret simpel INDY (ver 9.02) TCP server application. Server componenten i denne application kører med CommandHandlers, to styk, der hver har deres OnCommand-events.Når en client, fx. en Telnet client, har logget på og senere sender en af de to commands disse handlers reagerer på, så bliver den pågældende metode udført og som parameter overføres \"ASender: TIdCommand\".
Hvorledes kan jeg udfra denne parameter se hvilken client der er tale om? Fx. dens IP adresse eller lignende?
Fidusen er, at jeg vil lave en application, hvor de enkelte clienter connecter og dernæst fortæller serveren at de har en eller anden \'evne\' - fx. at de råder over et digitalt output.
Senere skal man så kunne sende en command fra serveren til clienten om at \'bruge sin evne\' - fx. sætte den digitale udgang.
Serveren skal derfor dynamisk opbygge en liste over \'evner\' i forhold til disses fysiske placering (ejer client) og er derfor nødt til at kunne identificere client\' inputtene på en eller anden måde.
I nedenstående code viser kommentarene hvor der skal ske et eller andet.
Peter
unit fmFTPServerMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdFTPServer, StdCtrls,
IdUDPBase, IdUDPServer, IdTrivialFTPServer, ComCtrls;
type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
Memo1: TMemo;
StatusBar1: TStatusBar;
procedure FormShow(Sender: TObject);
procedure IdServer1Connect(AThread: TIdPeerThread);
procedure IdServer1Disconnect(AThread: TIdPeerThread);
procedure IdTCPServer1CommandHandlers0Command(ASender: TIdCommand);
procedure IdTCPServer1CommandHandlers1Command(ASender: TIdCommand);
private
{ Private declarations }
ConnectionCount : Integer;
public
{ Public declarations }
Function KnownCommands : TStrings;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
ConnectionCount := 0;
Memo1.Lines.Assign(KnownCommands);
Memo1.Lines.Insert(0, \'INSTRUCTIONS:\');
Memo1.Lines.Insert(1, \'=============\');
Memo1.Lines.Insert(2, \'Use Telnet to connect to port 21.\');
Memo1.Lines.Insert(3, \'Known commands:\');
Memo1.Lines.Add(\'\');
StatusBar1.SimpleText := \'Connection count: \' + IntToStr(ConnectionCount);
end;
procedure TForm1.IdServer1Connect(AThread: TIdPeerThread);
begin
Inc(ConnectionCount);
StatusBar1.SimpleText := \'Connection count: \' + IntToStr(ConnectionCount);
end;
procedure TForm1.IdServer1Disconnect(AThread: TIdPeerThread);
begin
Dec(ConnectionCount);
StatusBar1.SimpleText := \'Connection count: \' + IntToStr(ConnectionCount);
end;
function TForm1.KnownCommands: TStrings;
Var
t : Integer;
begin
Result := TStringList.Create;
For t := 0 To idTCPServer1.CommandHandlers.Count- 1 Do
Result.Add(IdTCPServer1.CommandHandlers.Items[t].Command)
end;
// Commandhandlers.
procedure TForm1.IdTCPServer1CommandHandlers0Command(ASender: TIdCommand);
Var
t : Integer;
begin
//
// NB! HER! Hvilken client, fx. IP-adresse, sendte denne command?
//
For t := 0 To ASender.Params.Count-1 Do
Memo1.Lines.Add(\'Received: \'+ASender.Params[t]);
end;
procedure TForm1.IdTCPServer1CommandHandlers1Command(ASender: TIdCommand);
Var
t : Integer;
begin
//
// NB! HER! Hvilken client, fx. IP-adresse, sendte denne command?
//
For t := 0 To ASender.Params.Count-1 Do
Memo1.Lines.Add(\'Received: \'+ASender.Params[t]);
end;
end.