AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Serversocket wie Clients Unterscheiden ?

Ein Thema von Real_Thunder · begonnen am 13. Mai 2006 · letzter Beitrag vom 17. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#1

Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 09:04
Moin, ich bin es schon wiuieder.. nach einer nacht durchgrübeln.... komme ich einfach nicht weiter

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
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#2

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 09:28
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
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#3

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 09:36
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
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#4

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 09:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#5

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 10:11
Also ich habs in etwa so gemacht.

Bischen Bastelcode: Auszug!!

Und Teile meines Projects...

Delphi-Quellcode:

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;
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

Ü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.
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 15:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#7

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 20:39
hmm... und was ist, wenn es kein OnDisconnect-Ereignis gibt, weil der Client abgestürzt ist ???

Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Serversocket wie Clients Unterscheiden ?

  Alt 13. Mai 2006, 21:44
Zitat von Net7:
hmm... und was ist, wenn es kein OnDisconnect-Ereignis gibt, weil der Client abgestürzt ist ???
Dann ist die Socket Instanz trotzdem gültig. Diese wird erst nach einem OnDisconnect gelöscht, somit kein Problem. Wenn du dir selber eine Art Ping in dein Protokoll implementierst, dann kannst du diesen Absturz selber mitbekommen und selber den Socket mit Close schliessen (Socket.Close -> löst auch wieder ein OnDisconnect aus). Auch wenn beim senden ein Fehler kommt oder sonstiges, alles kein Problem mit den o.g. Methoden.

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.
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#9

Re: Serversocket wie Clients Unterscheiden ?

  Alt 15. Mai 2006, 09:46
So ich habe es mit
Delphi-Quellcode:
Socket: TCustomSocket

connect_id:= integer(socket);
geamcht.

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:
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;
Und es funktioniert.. (Sieht aber nciht besonders Schön aus)


Gibt es eine möglichkeit das integer(Socket) wieder rückgängig zu machen ? also quasi ein Socket(integer)
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#10

Re: Serversocket wie Clients Unterscheiden ?

  Alt 15. Mai 2006, 10:24
Zitat:
...aber die kann ich nun direct rückschlüsse ziehen aus der connect id
Was meinst du damit genau, was für Rückschlüsse möchtest du denn haben ?

Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:22 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