![]() |
Serversocket wie Clients Unterscheiden ?
Moin, ich bin es schon wiuieder.. nach einer nacht durchgrübeln.... komme ich einfach nicht weiter :wall: :wall: :wall: :wall:
diesmal geht es um die TServerSocket Compnente.. und bitte nun keine posts von wegen dann minn doch INDY also.. alles was ich wissen mächste ist wie ich verschiedene Clients auseinanderhalten kann also kleines bespiel.. client 1 hat daten die fpr client 3 bestimmt sind... wie sage ich dem serve nun das er die daten zu client 3 packen soll eine ganz 'Böse' lösung wenn man es berhaupt so nennen könnte währe mit einer schleife einen befehl zum identifizieren geben , und wenn der identifizierung stimmt dann soll er das packet dort hin senden.. dauert aber lange, und frißt recourcen..... also gbt es nicht eine möglichkeit der verbindug gleich beim commenten einen wert zuzuweisen der sich fr diese verbindung nicht mehr ändert ? also wie quasi serversocket1.socket.connections[x] ..... oder so ähnlich... ich hoffe ihr könnt mir auch dabei weiterhelfen Vieln dan im vorraus |
Re: Serversocket wie Clients Unterscheiden ?
Du könntest dir ein Array abspeichern mit den ganzen Sockets.
D.h. wenn jetzt ein neuer Client dazukommt dann merkst du dir des Socket und halt andere Infos (z.b. Client1) in einem Record. In dieses Record speicherst du in dem Array. Ich hoff des hilft dir weiter. Funktionieren tuts auf alle fälle hab ich auch schon gemacht und bei mir hats gefunkt |
Re: Serversocket wie Clients Unterscheiden ?
Also in meinem Projekt hatte ich es über die Handlenummer der Verbindungen gelöst, die bei jedem angedockten Clienten anders ist.
Schau dir mal die Sache mit den Handles näher an und du bist der Lösung schon recht nahe ;) Über die Handlenummern kannst du dann auch die Connections ermitteln, ist übrigens viel sicherer als die Sockets zu zählen und durchzunummerieren. Eine Verbindung kann ja auch mal abreißen wenn sich ein Client aufhängt oder so.. Mfg Net7 |
Re: Serversocket wie Clients Unterscheiden ?
Habe es schon eimal mit de rHanldnummer versucht... also ich weise dann quasi nur beim onclient connect die handlingnummer den jeweiligen client zu
aber wie kann ich ruckschlüsse von der handlignummer auf die verbindung .. ch habe da eine leichte idee, werde mich gleich mal ransetzten.. ich hatte die handlingnumemr auch schnal gehabt.. nun weiß ich allerdings nicht ehr wie ich dazu gekommen bin... aber jetzt wo du es sagst, ich kan mir die handlingnummer beim on connect oder ersten on'read holen, sobald der client seinen ident sendet, und spter wenn ich diesen client brauche ein schleife machen werde es erstmal versuchen... melde mich dann wiedeer Grüße Real_Thunder |
Re: Serversocket wie Clients Unterscheiden ?
Also ich habs in etwa so gemacht.
Bischen Bastelcode: Auszug!! Und Teile meines Projects...
Delphi-Quellcode:
Ich hoffe der Code hilft dir weiter, die Überwachung ob der Client Online ist bzw seine Löschung geb ich dir noch nicht... "Sebst ist der Mann" aber wenn du da irgendwie hängenbleibst geb ich dir gerne wieder Tipps ;)const MaxAnzCon=100; Type TAInt=array[0..MaxAnzCon] of Integer; Type TClientenverwaltung=record Con : TAInt; // Socketnummer HNr : TAInt; // dazugehörige Handlenummer isOnline :array [0..MaxAnzCon] of boolean; // ist er auch noch online end; ..... CV:TClientenverwaltung; // CV ( Clientverwaltung) Array mit Anfangswerten beschreiben procedure TNet7Server.Init; (* -------------------------------------------------------------------------- *) var i: Integer; begin // Serverliste mit Wert -1 füllen for i := 0 to MaxAnzCon do begin cv.Con[i] := -1; cv.HNr[i] := -1; cv.isOnline[i] := false; end; end; //Clienten in Liste aufnehem bei Event ClientonConnect funktionsfähig procedure TNet7Server.ClientOnList; (* -------------------------------------------------------------------------- *) var LZaehler: Integer; begin LZaehler := 0; //zähle solange hoch bis du einen freien Paltz (-1) in der Liste findes while cv.HNr[LZaehler] > -1 do begin inc(LZaehler); end; cv.HNr[LZaehler] := socket.Connections[socket.ActiveConnections-1].Handle; cv.isOnline[LZaehler] := true; cv.Con[LZaehler] := socket.ActiveConnections-1; end; Über den Aufruf des Records also cv[x].bla hast du die Socketnummer, die Handlenummer und umgekehrt... mfg Net7 // Edit: Einen Stolperstein möchte ich ich dir noch ersparen. Bedenke!!!!! Sobald ein Client offline geht rutscht die Socketnummer einen Wert tiefer und die gespeicherte Handlenummer im Record stimmt mit der Socketnummer im Record nicht mehr überein. |
Re: Serversocket wie Clients Unterscheiden ?
Warum nur immer so umständlich?
Folgende Punkte dazu als Ideen/Hinweise: 1. In den Ereignisen wird immer ein Socket vom Typ TCustomWinSocket übergeben. Diesen findet man immer in der Connection[] Eigenschaft vom Server wieder. Jederzeit, bei jedem Ereignis. Selbst beim OnDisconnect wird dieser erst nach Abarbeitung des Ereignis-Callbacks entfernt. 2. Die Instanz des TCustomWinSocket, welcher übergeben wird und in der o.g. Eigenschaft vorhanden ist, ist eindeutig über seine Lebzeit. Mit anderen Worten: Wenn ihr die Instanzenadresse als "Handle" nutzt ("Handle" := Integer(Socket)), dann ist diese eindeutig vom OnClientConnect Ereignis bis zum OnClientDisconnect Ereignis. (Wobei hier ein direktes vermerken der Socket Instanz einfacher ist, da man so einfach den Socket bei der Hand hat, wenn man die Informationen von anderer Seite aus seinem Datengrund herausholt.) 3. Wenn ihr zusätzliche Informationen zu den Sockets verwalten wollt, dann definiert euch einen Record oder eine Klasse und legt sie darin ab. Die eindeutig Zuordnung schafft ihr durch vermerken der Record Adresse bzw. der Instanz der Klasse in der Data Eigenschaft des TCustomWinSockets. So legt den Record bzw. die Klasse im OnClientConnect an und weist ihn zu - beim OnClientDisconnect gebt ihn wieder frei. In allen zwischenzeitlichen Ereignissen bekommt ihr den Socket mit an den Kopf geworfen, also einfach die Data Eigenschaft nutzen und ihr wisst, um welchen Client es geht. Um zur ersten Frage von mir zurück zu kommen: Wozu eine Socket/Handlenummer verwalten, wenn die Socket-Instanz eindeutig ist, verwaltet wird und zusätzliche Informationen (Data Eigenschaft) aufnehmen kann. |
Re: Serversocket wie Clients Unterscheiden ?
hmm... und was ist, wenn es kein OnDisconnect-Ereignis gibt, weil der Client abgestürzt ist ???
Mfg Net7 |
Re: Serversocket wie Clients Unterscheiden ?
Zitat:
Im OnError empfehle ich grundsätzlich den angegebenen Socket mit Socket.Close zu schliessen, da man nach einem Fehler von dem Socket bei den TServerSocket/TClientSocket nix mehr erwarten kann. |
Re: Serversocket wie Clients Unterscheiden ?
So ich habe es mit
Delphi-Quellcode:
geamcht.
Socket: TCustomSocket
connect_id:= integer(socket); Es geht Wunderbar. Das Ergebnis speichere ich zusammen mit einer Identnummer des users. Das Array sieht dann so aus:
Delphi-Quellcode:
Element 1: connect_id user_id
Element 1: connect_id user_id Element 1: connect_id user_id aber die kann ich nun direct rückschlüsse ziehen aus der connect id bis jetzt habe ich es so gemacht
Delphi-Quellcode:
Und es funktioniert.. (Sieht aber nciht besonders Schön aus)
for y:=0 to serversocket1.Socket.ActiveConnections-1 do begin
if inttostr(integer(serversocket1.Socket.Connections[y]))= find_client[0] then begin serversocket1.socket.Connections[y].SendText('Testtext''); end; end; Gibt es eine möglichkeit das integer(Socket) wieder rückgängig zu machen ? also quasi ein Socket(integer) |
Re: Serversocket wie Clients Unterscheiden ?
Zitat:
Mfg Net7 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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 by Thomas Breitkreuz