Einzelnen Beitrag anzeigen

catwiesel

Registriert seit: 7. Mär 2010
3 Beiträge
 
#1

TServerSocket OnClientRead - Client # identifzieren

  Alt 7. Mär 2010, 07:08
Hallo,

ich bin mal wieder dabei mit delphi herumzuspielen. Im moment versuche ich mich an einer server/client struktur.

Ich benutze TServerSocket und TClientServer. Soweit funktioniert alles ganz gut.

Kleine Frage kommt aber auf.

Wenn an einen server mehrere clients (sagen wir 3) connected sind und der server etwas empfängt und mit OnClientRead abgearbeitet wird... Gibt es eine kleine, feine server-side möglichkeit zu identifzieren welcher client (1, 2 oder 3) das paket geschickt hat?

Fiktives Beispiel:

Delphi-Quellcode:
...
procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var MSG: TChatMSG;
var i:integer;
begin
If MSG.Text='disconnect me!then
  begin
  i:=SocketNumber; // <-- SocketNumber ist hier der fiktive wert/befehl den ich suche
  ServerSocket.Socket.Disconnect(i);
  end
else
{ hier käme behandlung von text wenn nicht disconnect me! }
end;
...
Irgendwo/wie hat delphi die connection doch gespeichert für sachen wie:
ServerSocket.Socket.Connections[x]
ServerSocket.Socket.Disconnect(x)

wobei ich eben nach dem rückwertsweg suche. also wie kriege ich x heraus?

Anmerkung: ich könnte mir vorstellen workarounds zu benutzen:
- ein array mit # und ip erstellen und bei jedem OnClientRead die IP mit dem array vergleichen und bei treffer i setzen. Nachteil: CPU intensiv wenn die clientzahl steigt und das array muss immer aktuallisiert werden wenn ein neuer client (dis)connected...
- jedem client eine id zuweisen und sie ihm senden und jedesmal mit an den server senden. Nachteil: overhead und man könnte es exploiten und einen anderen client disconnecten lassen...

Nur wie gesagt, wenn es ohne diese workarounds geht entschuldigt dass ich nicht von alleine drauf komme (oder ein tutorial/beispiel finde) und fragen muss.

Edit: ich hab irgendwoanders etwas von TSocketNotifyEvent gelesen mit dem das anscheinend gehen soll. leider komm ich nicht drauf wie ich das benutzen soll bzw auf die connection# komme.

Danke im Vorraus
Catwiesel
  Mit Zitat antworten Zitat