Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi tserversocket user unterscheiden (https://www.delphipraxis.net/58120-tserversocket-user-unterscheiden.html)

G G 1. Dez 2005 16:46


tserversocket user unterscheiden
 
hallo folgender code


Delphi-Quellcode:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var i :integer;
begin

  For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
   begin // Anzahl der Teilnehmer
   with ServerSocket1.Socket.Connections [I] do
  if (Connected) then SendText('hallo');
 end;
end;
nun meine frage wenn ich I ändere und z.B nur an I = 5 schicke dann kriegt die verbindung nummer 5 die nachricht. Aber nun wie kann ich z.B im onconnect event erkennen welches I dieser neuer benutzter hat?

Aenogym 1. Dez 2005 17:01

Re: tserversocket user unterscheiden
 
hi G G,

du kannst die verbindungen doch ganz easy über ihre IP-adressen auseinanderhalten ;)

aenogym

G G 1. Dez 2005 17:13

Re: tserversocket user unterscheiden
 
ahja schon dann hab ich die ip addreese aber wnen ich dann eine nachricht an einen schicken will z.B

with ServerSocket1.Socket.Connections [I] do
if (Connected) then SendText('hallo');


dann muss ich ja wissen welchs I für welche ip steht.

also wie find ich den dieses I heraus, odr knan man die ip umwandeln?

Aenogym 1. Dez 2005 17:36

Re: tserversocket user unterscheiden
 
Zitat:

Zitat von G G
also wie find ich den dieses I heraus, odr knan man die ip umwandeln?

also ich hab mir für sowas ne funktion geschrieben, die den connections-array durchläuft und prüft, ob die IP des aktuellen eintrags der gesuchten entspricht. wenn ja, wird der index zurückgegeben und die schleife verlassen.

aenogym

G G 1. Dez 2005 17:44

Re: tserversocket user unterscheiden
 
ah nicht schlecht, willst du die vll mal herzeigen? :wink:

Aenogym 1. Dez 2005 18:12

Re: tserversocket user unterscheiden
 
Zitat:

Zitat von G G
ah nicht schlecht, willst du die vll mal herzeigen? :wink:

also eine schleife dadurch zu machen ist doch nicht so schwer ;)

aber weil ich gute laune hab:

Delphi-Quellcode:
function GetConnectionID(AServerSocket: TServerSocket; AIP: string): integer;
var i: integer;
begin
  for i:=0 to AServerSocket.Connections.count-1 do
  begin
    if AServerSocket.Connections[i].RemoteAddress = AIP then
    begin
      result := i;
      break;
    end;
  end;
end;
(das hab ich aus dem kopf geschrieben. falls da ein fehler drin ist, wirst du den aber sicher selber beheben können ;) )

aenogym

Muetze1 1. Dez 2005 22:02

Re: tserversocket user unterscheiden
 
Omg - ich glaube ich sollte doch mal ein Socket Tutorial schreiben. Ich liebe ja die alten Kompos, die sind so schön einfach...

Aber egal, ihr wollt was anderes wissen: Warum bastelt ihr hier mit IPs rum? Beim OnClientRead/OnClientConnect etc wird doch ein Socket übergeben (Parameter Socket) und dieser ist natürlich auch in dem Connections[] Array wieder zu finden, also einfach vergleichen ob du gerade die gleiche Instanz bearbeitest bzw. behandelst...

flossinger 6. Dez 2005 12:47

Re: tserversocket user unterscheiden
 
Hallo,

da ist etwas übersehen worden. Du kannst in der on connect procedure direkt dem neuen Client antworten.
Es braucht weder eine Schleife noch einen Vergleich.

Im on connect wird dir der socket zum neuen client übergeben.

Code:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
socket.SendText('welcome');
end;
Das ist getestet und funktioniert. Das sendet eine Antwort an den neuen client.

der flossinger

Muetze1 6. Dez 2005 13:27

Re: tserversocket user unterscheiden
 
Zitat:

Zitat von flossinger
da ist etwas übersehen worden. Du kannst in der on connect procedure direkt dem neuen Client antworten.
Es braucht weder eine Schleife noch einen Vergleich.

Im on connect wird dir der socket zum neuen client übergeben.

Darauf habe ich auch schon hingewiesen, hatte es aber bisher so verstanden, dass er eine Lösung sucht allen anderen Clients bis auf den neu verbundenen etwas zu schicken (z.B. vllt. die Join Mitteilung?).

flossinger 6. Dez 2005 13:51

Re: tserversocket user unterscheiden
 
Ja könnte sein, ich habe aus seinem 'hello' voreilig auf die Begrüssung des neuen clients geschlossen. Wie dem auch sei, für den anderen Fall würde ich ihm das folgende empfehlen:
Code:
for i:=0 to serversocket1.Socket.ActiveConnections - 1 do
   if (serversocket1.socket.connections[i].RemoteAddress = socket.RemoteAddress)
   and (serversocket1.socket.connections[i].RemotePort = socket.RemotePort)
   then serversocket1.socket.connections[i].sendtext('welcome')
   else serversocket1.socket.connections[i].sendtext('one more here')
   ;
- ist auch getestet und funktioniert.

der flossinger

Muetze1 6. Dez 2005 14:01

Re: tserversocket user unterscheiden
 
*heul* Ich fühl mich so ignoriert...

Schonmal meinen Beitrag zuvor gelesen den ich geschrieben hatte?

Delphi-Quellcode:
For i := 0 To Pred(ServerSocket1.Socket.ActiveConnections) Do
   If ( ServerSocket1.Socket.Connections[i] = Socket ) Then
     Socket.SendText('welcome')
   Else
     ServerSocket1.Socket.Connections[i].SendText('one more here');
Wie ich vorhin schon geschrieben hatte, ist die mit "Socket" übergebene Instanz im OnClientConnect schon zu dem Zeitpunkt in dem Connections[] Array aufgeführt. Da es nur eine Instanz gibt pro Verbindung, ist sie natürlich dort wiederzufinden.

flossinger 6. Dez 2005 14:11

Re: tserversocket user unterscheiden
 
ok, kannst schon wieder aufhören zu heulen.
Im Ernst, deine Lösung ist viel eleganter.

der Flossinger

creutz 3. Jan 2006 23:51

Re: tserversocket user unterscheiden
 
Hallo,

ich habe bei der Sache die hier angesprochen wurde ein kleines Problem und wollte nicht direkt einen neuen Thread aufmachen.

Bei mir gibts den Befehl Socket bei der TCPServer1 Komponente irgendwie nicht somit auch nicht activeconnections.
In der Delphi Hilfe wirds beschrieben, ich kanns aber net benutzen.

wenn ich

"serversocket." eingebe kommen ja normal die ganzen befehle da ist "socket" geschweige denn "socket.activeconnections" nit dabei
auch mit "serversocker.components[i]" komm ich da nicht weiter wenn ich nur n disconnect machen möchte oder an alle eine msg.



Hab ich da eine andre Komponente und muss andere befehle benutzen? Wenn ja welche?


Habe Delphi2005 Architect benutzt



Vielen Dank für eure Hilfe
creutz

Muetze1 4. Jan 2006 00:59

Re: tserversocket user unterscheiden
 
Das gibt es bei dir aus dem einfachen Grund nicht, da wir hier vom TServerSocket und TClientSocket, den es in den alten Delphi Versionen gab und ab Delphi 7 nicht mehr standardmässig von Borland installiert waren (aber noch mitgeliefert wurden). Ob sie bei der Delphi 2005 Architekt noch mit bei liegen, kann ich dir aus Ermangeln einer entsprechenden Delphi Version nicht sagen.

Grundlegend hat der TCPServer wie auch der TCPClient nix mit den hier beschriebenen Komponenten zu tun und somit kannst du die hier angesprochenen Dinge nicht auf diese anwenden.

In deiner Delphi Version empfiehlt sich eher die Nutzung der Indy Komponenten anstatt die alten TServerSocket/TClientSocket irgendwie in Delphi reinzuprügeln. In der Suche findest du genug Beispiele - im Forum und CodeLib.

creutz 4. Jan 2006 01:44

Re: tserversocket user unterscheiden
 
Problem hat sich gelöst.

Die komponenten liegen bei müssen aber erst noch ausm BIN verz. importiert werden.
Die momentanen standart kompo sind andere


trotzdem danke

grüße
creutz


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz