AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TServerSocket OnClientRead - Client # identifzieren
Thema durchsuchen
Ansicht
Themen-Optionen

TServerSocket OnClientRead - Client # identifzieren

Ein Thema von catwiesel · begonnen am 7. Mär 2010 · letzter Beitrag vom 8. Mär 2010
Antwort Antwort
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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TServerSocket OnClientRead - Client # identifzieren

  Alt 7. Mär 2010, 08:09
TSocketNotifyEvent ist die Routine, welche du oben gerade implementierst. Das kennzeichnende daran sind die 2 Übergabeparameter. Zum einen Sender: ist hier nicht von Interesse. Zum anderen "Socket": Das ist genau das Socket, dass dir geschrieben hat und an welches du antworten musst/kannst.
Du kannst jetzt natürlich noch etwas probieren:
Delphi-Quellcode:
for x:=0 to ServerSocket.SocketCount-1 do
  if ServerSocket.Socket[x]=Socket then Socketnumber:=x;
aber du wirst feststellen, dass es quatsch ist, erst die Nummer rauszusuchen um dann gleich wieder aus der Nummer das entsprechende Socket zu bestimmen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
catwiesel

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

Re: TServerSocket OnClientRead - Client # identifzieren

  Alt 7. Mär 2010, 21:49
Danke.

Muss aber dennoch nochmal genau nachfragen. Leider komme ich gerade nicht an delphi ran und kanns nicht selber probieren...

Ich vermute ich kann nicht einfach i:=socket setzen und dann in i die zahl zu haben deren client mir eben gesendet hat. Oder doch? Du implizierst es ein wenig in deiner antwort.

Ich verstehe deine schleife und bin dankbar, es wäre eine lösung. aber sozusagen nur eine notlösung eben weil eine schleife durchläuft und bei steigender client zahl cpu leistung frisst...
du implizierst auch dass die schleife blödsinn wäre. aber wie setze ich dann i auf die nummer deren client mir eben was gesendet hat?

danke im vorraus
Catwiesel

edit:
ich hab nun socket versucht, ging natürlich nich.
ich hab auch deine schleife versucht, und ich versteh nich ganz, aber sie geht auch nicht. anscheinend kennt er socketcount nicht? habe dann ActiveConnections genommen, aber dann stockt er bei ServerSocket.Socket[i]=Socket
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: TServerSocket OnClientRead - Client # identifzieren

  Alt 8. Mär 2010, 07:33
Wieso willst Du überhaupt den Index haben? Falls Du über den Index in einem anderen Array irgendwelche Daten ablegen willst, dann verwende lieber die 'Data'-Eigenschaft des Sockets.
Delphi-Quellcode:
procedure TfmMain.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.Data := TUserData.Create;
end;

procedure TfmMain.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  TUserData(Socket.Data).Free;
end;

procedure TfmMain.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  With TUserData(Socket.data) do // ja ja, with ist pöse
end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
catwiesel

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

Re: TServerSocket OnClientRead - Client # identifzieren

  Alt 8. Mär 2010, 19:48
hmm, wieso will ich den index haben? aus verschiedenen gründen. hauptsächlich weil ich bei incomming connections wissen von welchem client die nachricht kommt ohne alle ActiveConnections in einer Schleife abzuklappern und die RemoteIP mit einem array zu vergleichen um auf den index zu kommen - oder den clients immer die aktuelle index zahl zu geben, die clients jedesmal mitschicken zu lassen und zu aktuallisieren bei jedem disconnect.

vielen dank auch für deinen vorschlag mit der data eigenschaft des sockets. ich werde damit mal herumspielen und schauen ob es für meine zwecke reicht.

wenn aber vielleicht doch noch jemand eine property kennt die mir einfach (mehr oder weniger) einen integer wert liefert der der connection# entspricht dass man folgendes tun könnte wäre ich sehr dankbar:

ServerSocket.Socket.Disconnect(connection#);
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: TServerSocket OnClientRead - Client # identifzieren

  Alt 8. Mär 2010, 21:00
Vielleicht passt Du dein Konzept einfach dem 'as-is' an.
So ein Socket kennt doch seine IP-Adresse.

Wie gesagt, 'welcher' Client dich gerade angerufen hat, sagt die Socket-Instanz aus. Ein und der selbe Client wird immer den gleichen Socket verwenden, also könntest Du eine ClientID aus 'Integer(Socket)' erstellen. Oder eben du klebst -wie in meinem Beispiel- die Clientdaten gleich an die Data-Eigenschaft. Denn dazu ist sie doch da.

Einen Index kannst Du auch so vergeben, aber wozu, versteh ich immer noch nicht:
Delphi-Quellcode:
procedure TfmMain.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.Data := Integer (ErsterFreierIndexInMeinemArray);
  MeinArray[integer(Socket.Data)] := irgendwas;
end;

procedure TfmMain.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  MeinArray [Integer(Socket.Data)] := 0;
end;

procedure TfmMain.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
Var
  SocketIndex : Integer;

begin
  SocketIndex := Integer (Socket.Data);
end;
Du brauchst nicht wirklich einen Index....
Mir fällt gerade ein, du könntest einen brauchen, wenn du die Clients in einer Tabelle (TStringGrid o.ä.) darstellen willst. Dann merkst Du dir den Index einfach in deinen TUserDaten, die Du an die 'Data'-Eigenschaft gepeppt hast, so ähnlich, wie in dem 2.Beispiel.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz