Autor Beitrag
Hagbard Celine
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Do 29.08.02 23:41 
Ich hab ein Serverprogramm das verschiedene Aufgaben übernehmen soll, zu diesem Zweck melden sich verschiedene Programme über TClient-Socket-Komp. am Server an!

Ich kann jetzt über socket.connection[i] der i-ten Verbindung einen Text zuordnen, woher weiss ich aber welches Programm das ist??
(Es können mehrere Programme auf einem Client laufen!!! Also nutzt IP nichts!)

Das kann sich ja jeden Moment ändern in dem ein Client mit kleinerem i sich abmeldet!

Gibt es eine Möglichkeit jeder Verbindung eine eindeutige Id zuzuordnen, welche bis zur Beendigung beibehalten wird?
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Fr 30.08.02 18:44 
der client könnte ja beim verbinden irgendeinen string senden oder eine zufallszahl, welche du dann auf dem server abspeicherst. Dann kannste du ja vergleichen und dem entsprechenden client daten schicken.

_________________
Viele Grüße
Jakob
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Fr 30.08.02 18:49 
DeCodeGuru hat folgendes geschrieben:
der client könnte ja beim verbinden irgendeinen string senden oder eine zufallszahl, welche du dann auf dem server abspeicherst. Dann kannste du ja vergleichen und dem entsprechenden client daten schicken.


Das bringt mich aber nicht unbedingt weiter!

Angenommen der Client ist mitlerweile offline, so muss ich allen anderen Client erst eine Abfrage schicken! Das dauert!

Und selbst wenn er online ist habe ich erst einen haufen Abfragen!

Ich will schon auf dem Server unterscheiden um möglichst schnell und mit wenig Aufwand eine Aussage über den richtigen Client zu machen!
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Sa 31.08.02 01:24 
Hab die Lösung gefunden!

Es gibt eine Eigenschaft DATA !

Das ist ein Pointer!

Mann kann jetzt hingehen und sich eine eigene Klasse ClientPropertys schreiben :

ausblenden Quelltext
1:
2:
3:
4:
5:
TYPE ClientPropertys = class
    public
        id : Word;
        Username : String;
        end;


Wenn ich ins onconnect-Event diesen Code zum :

1) erzeugen eines neuen Objektes
2) setzen der gewünschten Daten (ID && Benutzername!)
3) Zuordnung des Objets zum Pointer

schreibe,

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TTestprog.ClientAnmelden(Sender: TObject;
  Socket: TCustomWinSocket);
var cp : ClientPropertys;
begin
  cp := ClientPropertys.create;
  cp.id := conectionId;  // variable typ word
  cp.Username := 'XYZ';
  inc(conectionId);
  socket.Data := cp;
  end;


dann kann ich solange die Verbindung besteht diese Daten abfragen und Ändern!

Somit ist jede Socket-Verbindung eindeutig zu unterscheiden, je nachdem welche Unterscheidung ich brauche!

Hoffe das hilft irgendwem weiter!
XPert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129

Windows 98/00/Me/XP
D6 Pers
BeitragVerfasst: Sa 31.08.02 01:38 
Super Idee! *selbstprobier*

_________________
MfG Fabian Schweers :lol:
damadmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Sa 31.08.02 20:11 
ausserdem sollte jeder client einen anderen unpriviligierten (>1024) nutzen. daran lassen sich auf jedenfall die clients unterscheiden.

wenn aber nun verschiedene programme auf dem gleichen rechner gleichzeitig laufen, könnte es probleme geben.
ich weiss nicht genau ob dann der port automatisch inkrementiert wird.

_________________
Alle Rechtschreibfehler sind gewollt und sollen meine Individualität verstärkt zum Ausdruck bringen.
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Sa 31.08.02 21:15 
damadmax hat folgendes geschrieben:
ausserdem sollte jeder client einen anderen unpriviligierten (>1024) nutzen. daran lassen sich auf jedenfall die clients unterscheiden.


mal ganz blöd gefragt : Was ist ein unpriviligierter??

damadmax hat folgendes geschrieben:
wenn aber nun verschiedene programme auf dem gleichen rechner gleichzeitig laufen, könnte es probleme geben.
ich weiss nicht genau ob dann der port automatisch inkrementiert wird.


Wenn man den Postings anderer Coder glauben kann dann übernimmt das der ServerSocket automatisch!

Aber zum anmelden müssen alle den selben nutzen!

Hab noch nicht probiert ob der neu zugewiesene Port dann auch abrufbar ist!

Was aber wenn ein Client sich abmeldet und der Port an einen neuen Client vergeben wird, wenn dann die alte IP noch an irgendeiner Stelle vergeben ist dann kann es zu Problemen kommen!

(Kann bei meiner Programmstruktur vorkommen, da der Server zwischen verschiedenen Programmen vermittelt und evtl. eine Antwort eines Programmes an den Server kommt bei dem das anfordernde Programm bereits beendet wurde! Dann soll ja nicht der neue Client die Nachricht bekommen!)
damadmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 60



BeitragVerfasst: Mo 09.09.02 13:39 
Hagbard Celine hat folgendes geschrieben:

mal ganz blöd gefragt : Was ist ein unpriviligierter??

die ports 1 - 1023 (oder 1024; bin mir da grad nich sicher) sind priviligierte ports, d.h. sie sind für irgendeinen zweck z.b. http(80) ftp(21+20) etc. reserviert. alle ports darüber werden entweder als 'antwortport' oder z.b. für andere 'inoffizielle' dinge benutzt (spiele, messenger, etc).

Hagbard Celine hat folgendes geschrieben:

Was aber wenn ein Client sich abmeldet und der Port an einen neuen Client vergeben wird, wenn dann die alte IP noch an irgendeiner Stelle vergeben ist dann kann es zu Problemen kommen!


da musst du schon aufpassen. das serversocket sollte ein event auslösen sobald sich ein client abmeldet. erst dann kann ein anderer client diesen port wieder nutzen. ähnlich verhält es sich wenn der client abstürzt oder probleme mit der verbindung auftauchen. bevor der port erneut vergeben werden kann muss das socket in ein timeout laufen. dann wird der port wieder frei.

ein socket besteht ja aus server-ip, server-port und client-ip, client-port. mit den informationen kann man jeden host unterscheiden. auch mehrere gleiche programme auf einem client (z.b. mehrere browser)


damadmax hat folgendes geschrieben:
ausserdem sollte jeder client einen anderen unpriviligierten (>1024) nutzen. daran lassen sich auf jedenfall die clients unterscheiden.

das vergiss mal bitte wieder, da war ich wohl besoffen.

_________________
Alle Rechtschreibfehler sind gewollt und sollen meine Individualität verstärkt zum Ausdruck bringen.
Hagbard Celine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: Mo 09.09.02 14:09 
Hab schon einen guten Weg gefunden die Verbindungen zu unterscheiden,

an jede Socket-Verbindung kann ich über den Pointer data beliebige Objekte anhängen, so kann ich alles zu einer Verbindung speichern was ich möchte, und brauche!

Danke aber das mit der Portunterscheideung kann bestimmt noch sehr nützlich werden!
Bierschlucker
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 10.09.02 16:06 
Hi Hagbard Celine,

Ich weiss zwar nicht ob dir das weiterhilft, aber ich habe das Problem so gelöst jedem Client einen eigenen Prozess zuzuordnen. Der Server wird zunächst als Dämon gestartet und bei jeder Connection eines Clients dupliziert. Damit hat jeder Client einen eigenen Prozess. Wenn die Verbindung abreisst oder der Client die Verbindung beendet wird der Server - Prozess ebenfalls beendet (Logischerweise mit Log - Aufzeichnung in ner Datenbank). Mysql verwendet diese Methode auch. Leider kann ich dir für Delphi keinen Code anbieten, da bei mir der Server auf ner Linux - Kiste läuft und ich den ganzen Müll in Perl programmiert (und mit perl2exe kompiliert) habe (so'n Server braucht ja auch keine graphische Oberfläche).

MFG Wolfgang